Angularjs инжектира контролер празен при тестване с Jasmine

В момента работя с Angular и използвам Karma и Jasmine, за да направя тестването. Филтрите, например, се инжектират към главния модул и могат да се тестват без проблем, но когато се опитам да тествам контролерите, получавам празен обект след инжектирането.

Ето кода на моя основен модул:

(function () {

    'use strict';

    var dependencies = [];

    angular.module('myApp', dependencies)

}());

Контролерът, който трябва да тествам:

(function () {
    'use strict';

    angular.module('myApp')

        .controller('NavCtrl', ['$scope',
            function ($scope) {

                $scope.currentUser = null;

            }]);
}());

И накрая тестовият пакет:

describe ("controller", function() {

    beforeEach(module("myApp"));

    var $scope, $rootScope, controllerLoader;

    beforeEach(inject(function($injector) {
        $rootScope = $injector.get('$rootScope');
        $scope = $rootScope.$new();

        var $controller = $injector.get('$controller');

        controllerLoader = function() {
            return $controller('NavCtrl', {
                '$scope': $scope
            });
        };
    }));

    it ("testing injection", function() {

        var controller = controllerLoader();
        expect(controller).toNotEqual({});

    })

});

Но резултатът от теста е НЕУСПЕШЕН и след отстраняване на грешки виждам, че инжектираният контролер е празен. Вече се опитах да дам фалшиво име за контролера и тестът просто се срива, което означава, че контролерът е открит, но по някаква причина не получавам свойствата му.


person Eduardo Páez Rubio    schedule 25.03.2014    source източник
comment
Опитайте се да преместите var $controller = $injector.get('$controller'); във функцията controllerLoader.   -  person Davin Tryon    schedule 25.03.2014
comment
защо искате контролер за достъп? в тестов случай вече имате достъп до $scope   -  person doodeec    schedule 25.03.2014
comment
Това проработи, не знаех как да осъществя правилен достъп до контролера. Очевидно, като помислих два пъти, трябва да го направя през $scope. Много благодаря!   -  person Eduardo Páez Rubio    schedule 25.03.2014
comment
как реши това? нов съм в karma/jasmine/angularjs...срещам и този проблем, но не разбирам защо...   -  person rcheuk    schedule 13.02.2015
comment
проверете коментара на @doodeec   -  person Eduardo Páez Rubio    schedule 17.02.2015


Отговори (1)


Имах подобен проблем. Разликата е, че в моето приложение използвам RequireJS, така че някои части са малко по-различни, но предполагам, че като цяло може да ви помогне.

Промених го, за да съответства на вашите имена:

define(['app/app.module', 'angular', 'angular-mocks'], function () {

  describe('Controller Unit test', function () {

    var $controller;

    beforeEach(module('myApp'));

    beforeEach(inject(function (_$controller_) {
        // The injector unwraps the underscores (_) from around the parameter names when matching
        $controller = _$controller_;
    }));

    describe('Get the controller', function () {
        it('should contain controller', function () {
            var $scope = {};
            var controller = $controller('NavCtrl', {$scope: $scope});

            console.log(controller);
            expect(controller).toBeDefined();
        });
    });
  });
});

Много е важно да заредите както ъглови, така и ъглови мокове. Мисля обаче, че основният проблем е, че вашата controllerLoader функция е в beforeEach раздел. Инжекцията трябва да се направи в describe секцията на самия тест.

person Atais    schedule 18.08.2015