【发布时间】:2016-12-18 10:03:07
【问题描述】:
我在我想要进行单元测试的 Angular module 的 config 函数中定义了一些设置代码。我不清楚我应该如何做到这一点。下面是一个简化的测试用例,显示了我是如何陷入困境的:
'use strict';
angular.module('myModule', []).config(['$http', '$log', function($http, $log) {
$http.get('/api/getkey').then(function success(response) {
$log.log(response.data);
});
}]);
describe('myModule', function() {
it('logs a key obtained from XHR', inject(function($httpBackend) {
$httpBackend.expectGET('/api/getkey').respond(200, '12345');
angular.module('myModule');
$httpBackend.flush();
}));
});
这显然不是正确的方法,因为我收到以下错误:
Error: No pending request to flush !
可以在on GitHub 找到带有上述测试代码的完整、可运行的 Angular 项目。如果您知道如何处理这种情况,请在 Stack Overflow 上回答。如果您还向 GitHub 存储库提交拉取请求,则会获得奖励积分。
【问题讨论】:
-
正如@mzulch 的回答指出的那样,您只能将提供程序(而不是实例)注入配置块。那么,如果您的代码不起作用,您如何期望单元测试成功?
-
一个问题可能会被误导(就像我现在理解的这个问题)。这可以在答案中指出。一个很好的答案解释了三件事:(1)如何在模块中全局使用服务,(2)如何测试
config块,(3)为什么不能同时拥有两者。 -
我想我对你的过程更好奇。我通常在我确信我的代码可以工作之后再编写测试,但现在我想起来,有些人坚持要先编写测试,然后再编写代码以适应测试。很公平。
-
中间还有第三种方式:先写代码,再写测试看看代码是否有效。我想这就是我在这里所做的。感谢您引起我的注意,我之前没有如此准确地反映过我的编程和测试顺序。 :-)
-
您正在测试不可行的代码这一事实并不能增加问题的清晰度。关于 config vs run 和 serviceName vs serviceNameProvider,请参阅this answer。配置和运行阶段有两个不同的注入器,分别注入服务提供者和服务实例。可以使服务提供者在实例注入器中可用,但反之则不行。这就是为什么
config块中的$http是一个难题。
标签: javascript angularjs karma-runner karma-jasmine angular-mock