2012-06-10 11 views
18

Kiedy próbuję uruchomić moje widowisko jaśmin, mamTypeError. Jasmine.getEnv() currentSpec jest null

TypeError: jasmine.getEnv().currentSpec is null in 
    http://localhost:8888/__JASMINE_ROOT__/jasmine.js (line 498) 

Nie mam pojęcia dlaczego, nawet nie wiesz, gdzie zacząć szukać.

Linia 498 jest:

return jasmine.getEnv().currentSpec.expect(actual); 

Robiłem jaśmin już od kilku miesięcy, ale nie na tym projekcie. Nigdy wcześniej tego nie widziałem.

Więc, od czego zacząć?

(Jest to jaśmin klejnot w projekcie szyn 3.x)

+7

Miałem ten sam problem, kiedy omyłkowo napisałem "opisz" zamiast "go" w moich testach. –

+0

Nie sądzę, że to było to, ponieważ uruchomiłem to na moim lokalnym pudełku i wydawało się, że działa dobrze. Uruchomiłem to na tunedowanej sesji ssh. Może to miało coś z tym wspólnego, ale nie powinno. Ale tak się stało. – Satya

+0

@ rinat.io Dzięki! To był problem dla mnie! –

Odpowiedz

0

Myślę, że problem jest w różnych wersjach kątowej w kątowe-mocks.js i skośnych scenario.js Jeśli urządzenie config wygląda następująco:

files = [ 
    JASMINE, 
    JASMINE_ADAPTER, 
    '../app/lib/angular/angular.js', 
// ANGULAR_SCENARIO, 
// ANGULAR_SCENARIO_ADAPTER, 
    '../app/lib/angular/angular-scenario.js', 
    '../app/lib/angular/jstd-scenario-adapter.js', 
    '../app/lib/angular/jstd-scenario-adapter-config.js', 
    '../app/lib/angular/angular-mocks.js', 
    '../app/lib/angular/angular-resource.js', 
    '../app/lib/angular/angular-cookies.js', 
    '../app/js/**/*.js', 
    '**/*Spec.js' 
]; 

unikać ANGULAR_SCENARIO i ANGULAR_SCENARIO_ADAPTER - zastąpić ją te, które są osadzone w twoim kanciastym źródle ("../app/lib/angular/angular-scenario.js", "../app/lib/angular/jstd-scenario-adapter.js", "../app/lib /angular/jstd-scenario-adapter-config.js "w moim przypadku).

+0

Nie sądzę, że używam kątowego. – Satya

+0

Używam karmy, jaśminu do kątowych testów aplikacji. Postępowałem zgodnie z twoją radą, ale wciąż mam ten sam problem: jasmine.getEnv(). CurrentSpec ma wartość null. – asa

0

Jak wygląda twój pełny test? Otrzymałem również ten błąd. Mój test wyglądał następująco:

'use strict'; 

describe("CalendarController", function() { 
    var scope, $location, $controller, createController; 
    var baseTime = new Date(2014, 9, 14); 
    spyOn(Date.prototype, 'getMonth').andReturn(baseTime.getMonth()); 
    spyOn(Date.prototype, 'getDate').andReturn(baseTime.getDate()); 
    spyOn(Date.prototype, 'getFullYear').andReturn(baseTime.getFullYear()); 
    var expectedMonth = fixture.load("months.json")[0]; 

    beforeEach(module('calendar')); 

    beforeEach(inject(function ($injector) { 
    scope = $injector.get('$rootScope').$new(); 
    $controller = $injector.get('$controller'); 

    createController = function() { 
     return $controller('CalendarController', { 
     '$scope': scope 
     }); 
    }; 
    })); 

    it('should load the current month with days', function(){ 
    var controller = createController(); 
    expect(scope.month).toBe(expectedMonth); 
    }); 
}); 

Zauważ, że funkcja SpyOn znajduje się w bloku opisu. Patrząc na kod jaśminowym stwierdzamy, że SpyOn powinny być w beforeEach lub it bloku:

jasmine.Env.prototype.it = function(description, func) { 
    var spec = new jasmine.Spec(this, this.currentSuite, description); 
    this.currentSuite.add(spec); 
    this.currentSpec = spec; 

    if (func) { 
    spec.runs(func); 
    } 

    return spec; 
}; 

...

jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { 
    if (this.currentSuite) { 
    this.currentSuite.beforeEach(beforeEachFunction); 
    } else { 
    this.currentRunner_.beforeEach(beforeEachFunction); 
    } 
}; 

Są to miejsca, gdzie currentSpec jest ustawiony. W przeciwnym razie będzie to wartość pusta. Więc w moim przykładzie powinno być:

'use strict'; 

describe("CalendarController", function() { 
    var scope, $location, $controller, createController; 
    var baseTime = new Date(2014, 9, 14); 
    var expectedMonth = fixture.load("months.json")[0]; 

    beforeEach(module('calendar')); 

    beforeEach(inject(function ($injector) { 
    scope = $injector.get('$rootScope').$new(); 
    $controller = $injector.get('$controller'); 

    createController = function() { 
     return $controller('CalendarController', { 
     '$scope': scope 
     }); 
    }; 
    })); 

    it('should load the current month with days', function(){ 
    spyOn(Date.prototype, 'getMonth').andReturn(baseTime.getMonth()); 
    spyOn(Date.prototype, 'getDate').andReturn(baseTime.getDate()); 
    spyOn(Date.prototype, 'getFullYear').andReturn(baseTime.getFullYear()); 

    var controller = createController(); 
    expect(scope.month).toBe(expectedMonth); 
    }); 
}); 

I wtedy to będzie działać, ponieważ spyOn jest w bloku go. Mam nadzieję, że to pomoże.

+0

Nie miał żadnych szpiegów. – Satya

+0

Aby pomóc osobom w pełni odpowiedzieć na to pytanie, należy opublikować pełną przykładową specyfikację. Mogą istnieć inne funkcje, które próbują ustawić 'this.currentSpec', które ulegają awarii. Otrzymałem ten sam błąd i to było rozwiązanie, mam nadzieję, że pomaga komuś innemu. – earlonrails

0

Wystąpiłem z tym problemem i znalazłem następujący artykuł. Wygląda na to, że wersja jaśminowa i wersje Angular nie współpracowały ze sobą.Kiedy wprowadziłem zmiany, artykuł nakreśla angular-mocks.js, błąd zniknął.

http://railsware.com/blog/2014/09/09/make-angularjs-1-0-7-work-with-jasmine-2-0/

wpadłem na to podczas robienia kursu PluralSight: Budowanie witryny z Bootstrap, angularjs, ASP.NET, EF i Azure. Podczas modułu testowania urządzenia.

1

Widziałem ten sam błąd. Miałem oświadczenie expect bezpośrednio wewnątrz describe. Przesunąłem expect wewnątrz bloku it, a błąd zniknął.

Dzięki rinat-io za pomysł.

Powiązane problemy