Подтвердить что ты не робот

ТипError: jasmine.getEnv(). CurrentSpec равно null

Когда я пытаюсь запустить мои спецификации жасмина, я получаю

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

Не знаю, почему, даже не знаю, с чего начать искать.

Строка 498:

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

Я занимаюсь жасмином уже несколько месяцев, но не в этом проекте. Я никогда раньше не видел этого.

Итак, с чего начать?

(Это жемчужный жемчуг в проекте rails 3.x)

4b9b3361

Ответ 1

Я видел ту же ошибку. У меня был оператор expect непосредственно внутри describe. Я переместил expect внутри блока it, и ошибка исчезла.

Благодаря rinat-io за идею.

Ответ 2

Я думаю, проблема в разных версиях angular в angular -mocks.js и angular -scenario.js Если ваш конфиг выглядит так:

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

попытайтесь избежать ANGULAR_SCENARIO и ANGULAR_SCENARIO_ADAPTER - замените его на те, которые встроены в ваш источник angular ('../app/lib/angular/angular-scene.js ','../app/lib/angular/jstd-scenario-adapter.js ','../app/lib/angular/jstd-scenario-adapter-config.js ' в моем случае).

Ответ 3

Как выглядит ваш полный тест? Я также получил эту ошибку. Мой тест выглядел так:

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

Обратите внимание, что функция SpyOn находится в описываемом блоке. При просмотре кода жасмина мы обнаруживаем, что SpyOn должен находиться в блоке beforeEach или 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);
  }
};

Это места, где установлен currentSpec. В противном случае это будет null. Поэтому в моем примере это должно быть:

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

И тогда это будет работать, потому что spyOn находится в этом блоке. Надеюсь, это поможет.

Ответ 5

Я столкнулся с этой проблемой и нашел следующую статью. Кажется, что версия jasmine и версии Angular не работали вместе. Когда я сделал изменения, статья очерчена до angular -mocks.js, ошибка исчезла.

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

Я столкнулся с этим, принимая курс PluralSight: создание сайта с помощью Bootstrap, AngularJS, ASP.NET, EF и Azure. Во время модуля тестирования модуля.