2012-06-10 12 views
18

Cuando trato de ejecutar las especificaciones de mi jazmín, consigoTypeError:. Jasmine.getEnv() currentSpec es nulo

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

Ni idea de por qué, ni siquiera seguro de dónde empezar a buscar.

línea 498 es:

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

que he estado haciendo jazmín desde hace varios meses, pero no en este proyecto. Nunca he visto esto sucediendo antes.

Entonces, ¿dónde empiezo?

(Esta es la gema de jazmín en un proyecto rieles 3.x)

+7

Tuve el mismo problema, cuando por error escribí 'describe' en lugar de' it' en mis pruebas. –

+0

No creo que fuera eso, ya que lo ejecuté en mi caja local y parecía funcionar bien. Estaba ejecutando esto en una sesión ssh tunelizada. Tal vez eso tuvo algo que ver con eso, pero no debería haberlo hecho. Pero lo hizo. – Satya

+0

@ rinat.io Gracias! Ese fue el problema para mí! –

Respuesta

0

Creo que el problema está en las diferentes versiones de angular en angular mocks.js y angulares-scenario.js Si su config se ve así:

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' 
]; 

tratar de evitar ANGULAR_SCENARIO y ANGULAR_SCENARIO_ADAPTER - sustituirlo por otros que están incrustados en su fuente angular ('../app/lib/angular/angular-scenario.js', '../app/lib/angular/jstd-scenario-adapter.js', '../app/lib /angular/jstd-scenario-adapter-config.js 'en mi caso).

+0

No creo que esté usando angular. – Satya

+0

Uso karma, jazmín para pruebas angulares de aplicaciones. Siguió su consejo, pero todavía tiene el mismo problema: jasmine.getEnv(). CurrentSpec es nulo. – asa

0

¿Cómo es tu prueba completa? También estaba recibiendo este error. Mi prueba se veía así:

'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); 
    }); 
}); 

Observe que la función SpyOn está en el bloque describir. Al mirar el código de jazmín nos encontramos con que SpyOn debe estar en un bloque beforeEach o it:

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); 
    } 
}; 

Estos son los lugares donde se desarrolla la currentSpec. De lo contrario, será nulo. Así que en mi ejemplo que debe ser:

'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); 
    }); 
}); 

Y entonces esto va a funcionar porque el SpyOn está en el bloque de la misma. Espero que esto ayude.

+0

No tenía ningún espía. – Satya

+0

Para ayudar a las personas a responder completamente esta pregunta, debe publicar las especificaciones de ejemplo completas. Podría haber otras funciones que intentan establecer 'this.currentSpec' que están fallando. Estaba obteniendo el mismo error y esta era la solución, con suerte, ayuda a otra persona. – earlonrails

0

Me encontré con este problema y encontré el siguiente artículo. Parece que la versión jazmín y las versiones angulares no funcionan juntas.Cuando realicé los cambios descritos en el artículo a angular-mocks.js, el error desapareció.

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

me encontré con esto mientras está tomando el curso Pluralsight: construcción de un sitio con Bootstrap, AngularJS, ASP.NET, EF y Azure. Durante el módulo de prueba de la unidad.

1

Estaba viendo el mismo error. Tenía una declaración expect directamente dentro de describe. Moví el expect dentro de un bloque it y desapareció el error.

Gracias a rinat-io por la idea.