【发布时间】:2015-12-02 15:12:03
【问题描述】:
在我的 module.run 块中,它正在调用我创建的服务的方法。在运行我的测试时,我希望它引用一个模拟服务,而不是发出 http 请求的真实服务。我目前正在尝试测试控制器,而不是实际的运行块本身 - 如何将模拟服务注入运行功能?我曾尝试使用 $provide.factory,但它似乎没有做任何事情,并且仍在正常加载服务。
我正在使用 Jasmine 编写测试。
app.js
angular.module("app")
.run(function(MyService) {
MyService.log("starting app");
});
test.js
describe("MyController", function() {
beforeEach(function() {
module(function ($provide) {
$provide.factory("MyService", { log: function(){} });
});
});
// I want module 'app' to execute its run function using injected value for MyService
beforeEach(module("app"));
beforeEach(inject(function($controller, $rootScope) {
MyController = $controller("MyController", { $scope: $rootScope.$new() });
}));
...........
});
【问题讨论】:
-
测试模块的运行块对您的单元测试是否必不可少? Angular 的建议是在隔离模块中声明 run 块,以便在单元测试中很容易忽略它,请参阅docs.angularjs.org/guide/module#run-blocks
-
我不想测试运行块,但是当我在测试中加载模块时它会自动执行,然后调用我不希望它执行的此服务
标签: angularjs unit-testing mocking jasmine inject