在我们的项目中,我们使用带有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测试?
答案 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会自动调用您的应用程序运行方法。