Как да представя моя контролер в тест 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' не е наличен! Или сте написали грешно името на модула, или сте забравили да го заредите. Ако регистрирате модул, уверете се, че сте посочили зависимостите като втори аргумент. Предавам ангуляритика по същия начин, по който вие предавате 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