Jasmine AngularJS中的测试控制器

时间:2015-08-28 04:45:47

标签: angularjs jasmine

我正在尝试使用Jasmine测试我的控制器和服务。

我有一个如下定义的家庭控制器

angular.module('TFPMPortal').controller('HomeController', Home);

    Home.$inject = ["$cookieStore", "PartsTrackHttpCallService", "$scope"];

    /* @ngInject */
    function Home(cookieStore, PartsTrackHttpCallService, scope) {
}

这是我使用Jasmine的单元测试

describe('HomeController', function () {
    var scope, ctrl, cookieStore, PartsTrackHttpService;

    beforeEach(module('TFPMPortal'));

    beforeEach(inject(function ($controller, $rootScope) {
        scope = $rootScope.$new();
        ctrl = $controller('HomeController', {
            cookieStore: null,
            partsTrackHttpService: PartsTrackHttpService,
            $scope: scope
        });
    }));

    it('should call the init data function', function () {
        var count = 0;
        PartsTrackHttpService.httpCall("common/tfpminitdata", scope.mc.PartsTrackProfile, true, true).then(function (response) {
            count = response.data.SiteList.length;
        });
        expect(scope.greeting).toBe("Greetings Frederik");
    });
});

我收到错误 - ' HomeController'不是一个功能,未定义。

1 个答案:

答案 0 :(得分:0)

在每个测试套件(测试文件)中,您需要确保加载包含您要测试的代码的Angular模块。

在这种情况下,您的HomeController已在名为“TFPMPortal”的模块上声明。在测试中加载此模块:

beforeEach(module('TFPMPortal'));

请注意,这会加载“TFPMPortal”模块,但如果您的控制器/测试使用的是应用程序中其他模块的服务/工厂/等,则还需要加载这些模块。例如,您似乎需要包含'ngCookies'(使用$cookieStore的b / c):

beforeEach(module('TFPMPortal', 'ngCookies'));

编辑:实际上在进一步审核时,您的上述测试代码通过传递$cookieStore来实现null依赖关系,因此可能不需要引用ngCookies模块...另一方面,没有必要这样做b / c Angular可以注入真实的$cookieStore