模块运行方法的角度单元测试

时间:2015-01-06 19:49:18

标签: angularjs

在我们的项目中,我们使用带有angularjs的requirejs。我们有一个主应用程序模块(app)和模块,用于所有服务(app-services),模块用于所有控制器(app-controllers),模块用于所有过滤器(app-filters)。模块app-controllers,app-services等作为依赖项添加到主app模块。

主要申请模块

var mainAppModule = angular.module('app', [
        'ngResource',
        'ngSanitize',
        'app.controllers',
        'app.directives',
        'app.services',
        'app.filters',
        'app.routes'
    ]);

mainAppModule.run(['$location', '$rootScope', function ($location, $rootScope) {
    $rootScope.sayHello = function(name) {
        console.log("Hello" + name);
    }
}]);

如何为mainAppModule.run方法编写Karma / Jasmine测试?

2 个答案:

答案 0 :(得分:4)

通常,逻辑应保持在外部运行方法(例如,包括在控制器,服务,指令,过滤器等中)。但是,您可以按如下方式测试运行方法。使用jasmine语法:

//Updating this method to use $log for DI
mainAppModule.run(['$location', '$rootScope', '$log', function ($location, $rootScope, $log) {
    $rootScope.sayHello = function(name) {
        $log.info("Hello" + name);
    }
}]);
//---------------------------

//Jasmine test
describe("app run", function () {
    var $rootScope;
    var $log;

    beforeEach(module("app"));
    beforeEach(inject(function (_$rootScope_, _$log_) {
        $rootScope = _$rootScope_;
        $log = _$log_;
    }));

    it("should expose sayHello function to $rootScope", function () {
        expect(angular.isFunction($rootScope.sayHello)).toBe(true);
    });

    describe("sayHello function", function () {
        it("should log 'Hello name'", function () {
            spyOn($log, "info");
            $rootScope.sayHello("test");

            expect($log.info).toHaveBeenCalledWith("Hello test");
        });
    });
});

答案 1 :(得分:0)

我认为最好的方法就是使用基于状态的验证来执行“run”方法。对于您提供的特定示例,将$ rootScope注入测试并验证它是否具有类型为function的“sayHello”属性。

IIRC当您从测试中调用angular.mock.module函数时,Jasmine会自动调用您的应用程序运行方法。