Как представить свой контроллер в тесте Jasmine/Karma

Я пытаюсь протестировать свой контроллер AngularJS, используя Jasmine с Karma. Когда я пытаюсь выполнить задокументированную процедуру для настройки теста контроллера, $scope не создается. На самом деле похоже, что раньше не выполняется вообще.

Вот мое объявление контроллера:

angular.module("myApp", ["ngCookies"])
       .controller("myCtrl", function($scope, $window, $location, MyService, 
                   $timeout, $log, $cookies, $q) {

Мой тест выглядит так:

describe("MyController test", function() {
var $scope;

beforeEach(
    module("myApp", ["ngCookies"]));
beforeEach(inject(function($rootScope, $controller) {
    $scope = $rootScope.$new(); // It looks like this is never called
    scope =$scope;
    $controller("myCtrl", {$scope: $scope});
}));
it("Checks the state of various units", function() {

    ...
});

Похоже, что материал beforeEach никогда не вызывается. Я предполагаю, что мне нужно ввести остальные мои свойства в контроллер, но если это так, я не уверен, как это сделать.

Это ошибка в журнале тестового запуска

FAILED MyController test Checks myFunction starting from blank state
Error: [$injector:modulerr] Failed to instantiate module ngCookies due to:
Error: [ng:areq] Argument 'fn' is not a function, got string
http://errors.angularjs.org/1.3.14/ng/areqp0=fn&p1=not%20a%20function%2C%20got%20string

person Victor Grazi    schedule 02.10.2015    source источник
comment
Я вижу что-то очень похожее. В моем случае отчасти причина в том, что inject() выдает исключение (перед вызовом обратного вызова), что модуль «angulartics» недоступен! Вы либо неправильно написали имя модуля, либо забыли его загрузить. При регистрации модуля убедитесь, что вы указали зависимости в качестве второго аргумента. Я передаю angularitics так же, как вы передаете ngCookies. И я уверен, что включил его, просто, может быть, не в том месте? Надеюсь, что любое предложенное здесь решение поможет и мне!   -  person Timothy Johns    schedule 02.10.2015


Ответы (1)


Моя первоначальная проблема, о которой я упоминал в комментарии к вашему вопросу, заключалась в том, что я пытался включить не минимизированную версию angulartics.js, но такой вещи нет. Изменение angulartics.js на angulartics.min.js решило эту конкретную проблему для меня.

Итак, я исправил это, а затем получил то же сообщение об ошибке «Аргумент« fn »не функция», что и вы.

Я понял, что оба наших кода создавали новый модуль при вызове module(), а не извлекали существующий модуль («myApp»), который отличается от примера кода.

Затем я изменил свой код beforeEach() с:

module('Sheets', ['ngResource', 'angulartics', 'angulartics.google.analytics']);

to

module('Sheets');

и теперь обратный вызов, который я передаю для инъекции, действительно вызывается.

Гипотетически можно попробовать изменить:

beforeEach(module("myApp", ["ngCookies"]));

to

beforeEach(module("myApp"));

...и посмотрим, получится ли дальше.

С моей стороны это все еще просто культовое программирование, и я понятия не имею, почему это сработало, поэтому мне нужно еще немного научиться, прежде чем я почувствую себя правильно. Если вы (или кто-либо другой) можете указать причину, по которой получение существующего модуля по сравнению с созданием нового актуально, для вас, безусловно, есть ответ или комментарий!

person Timothy Johns    schedule 02.10.2015
comment
Да, это избавило меня от проблемы с масштабом. Это похоже на ошибку в документации Angular! Спасибо. Теперь мне нужно выяснить, как внедрить все это в контроллер. - person Victor Grazi; 02.10.2015