我的应用程序中有一项服务,它$http
根据特定规范使用格式化请求。我一直在尝试对服务的方法运行单元测试,$httpBackend
用于模拟响应。在测试使用$http
.
我一直在遵循第一个答案中的模式: AngularJS - Testing service method that uses $http service
即,注册一个预期的请求$httpBackend
,定义一个响应,调用感兴趣的服务方法,然后刷新后端模拟。
除非我在调用我感兴趣的服务方法后注入$rootScope
、创建一个新范围并在其上运行 a ,否则我无法让它工作。$digest()
这是我在测试使用 的控制器和指令时使用的模式$http
,因为测试运行程序将指示没有待处理的刷新请求。但是,我没想到服务中有这个要求,因为scope
对我来说没有多大意义。此外,上面链接的问题的答案并不表明这是明确必要的。
今天早上在角度源中闲逛了相当长的时间后,我确定已成功为我的服务请求创建了一个承诺对象,但在' 的调用中$http
注册的承诺解决函数永远不会触发。只有当我在我的 servicesSpec 中添加一行来消化一个范围对象时,一切都会触发......$q.when
nextTick()
这是一个已知的问题?我正在使用 v1.2.0rc2。是否有解决方法可以将测试服务与范围对象分离?
作为参考,这里是运行的规范代码:
describe("widget services", function () {
beforeEach(module('widget.services'));
describe("WidgetDB", function () {
var service, $httpBackend, scope;
beforeEach(inject(function ($rootScope, WidgetDB, _$httpBackend_) {
scope = $rootScope.$new();
service = WidgetDB;
$httpBackend = _$httpBackend_;
}));
it("should do something", function () {
$httpBackend.expectPOST(myUrl).respond(myResponse);
service.getChartData(myArguments);
scope.$digest(); // why do I need this for testing services?
$httpBackend.flush();
/* test evaluations */
});
afterEach(function () {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
});
});