Угловое тестирование с Karma: после внедрения контроллера $ controller () не определен

Я пытаюсь настроить тестирование для Angular с помощью Karma и Jasmine. Я успешно установил и настроил Karma, но у меня проблемы с использованием angular-mocks. Ниже в файле aTest.spec.js я включил простое приложение, контроллер и тестовую спецификацию, чтобы проиллюстрировать проблему. Кто-нибудь может сказать мне, что я делаю не так?

Вывод моей консоли из Karma:

Chrome 39.0.2171 (Mac OS X 10.8.5) ControllerForTest encountered a declaration exception FAILED
TypeError: undefined is not a function
    at Suite.<anonymous> (/Users/duncanmalashock/python_projects/scout/public/tests/unit/aTest.spec.js:19:20)
    at jasmineInterface.describe (/Users/duncanmalashock/python_projects/scout/node_modules/karma-jasmine/lib/boot.js:59:18)
    at /Users/duncanmalashock/python_projects/scout/public/tests/unit/aTest.spec.js:13:1

Chrome 39.0.2171 (Mac OS X 10.8.5): выполнено 1 из 1 (1 НЕИСПРАВНО) ОШИБКА (0,004 секунды / 0,002 секунды)

karma.conf.js:

...
files: [
  'http://ajax.googleapis.com/ajax/libs/angularjs/1.3.5/angular.min.js',
  'angular/vendor/angular-mocks.js',
  'tests/unit/*.spec.js'
],
...

Контроллер:

var testApp = angular.module('testApp', []);

testApp.controller('ControllerForTest', ['$scope',
  function($scope) {
    $scope.data = {
      a: 'foo',
      b: 'bar',
      c: 'baz'
    };
  }
]);

aTest.spec.js:

describe('ControllerForTest', function() {
  module('testApp');
  var $controller;
  inject(function(_$controller_) {
      $controller = _$controller_;
  });
  var controller = $controller('ControllerForTest');
  it('is defined', function() {
    expect($controller).toBeDefined();
  });
});

person Duncan Malashock    schedule 23.12.2014    source источник


Ответы (1)


Создание экземпляра модуля и внедрение службы должны происходить в beforeEach, а не непосредственно в describe блоке. Это сделает их доступными для каждого из следующих its.

Вам также не нужно тестировать $controller, это сервис Angular. Вместо этого проверьте свой контроллер.

describe('ControllerForTest', function() {
  var $controller;
  var ControllerForTest;

  beforeEach(function() {
    module('testApp');

    inject(function(_$controller_) {
        $controller = _$controller_;
    });
  });

  it('is defined', function() {
    // This line can also be in the beforeEach.
    // Saves having to repetitively instantiate the controller.
    ControllerForTest = $controller('ControllerForTest');

    expect(ControllerForTest).toBeDefined();
  });
});
person user2943490    schedule 23.12.2014