Unit testing 无法在不调用作用域的情况下对使用$http的服务进行单元测试。$digest
我的应用程序中有一个服务,它使用Unit testing 无法在不调用作用域的情况下对使用$http的服务进行单元测试。$digest,unit-testing,angularjs,angular-services,Unit Testing,Angularjs,Angular Services,我的应用程序中有一个服务,它使用$http,根据特定规范格式化请求。我一直在尝试对该服务的方法运行单元测试,使用$httpBackend模拟响应。在测试使用$http的控制器和指令时,我没有遇到任何问题,但在我的服务中,我遇到了困难 我一直遵循第一个答案中的模式: i、 例如,使用$httpBackend注册一个预期的请求,定义对它的响应,调用服务感兴趣的方法,然后刷新后端模拟 除非我注入$rootScope,创建一个新的作用域,并在调用我感兴趣的服务方法后在其上运行$digest(),否则我
$http
,根据特定规范格式化请求。我一直在尝试对该服务的方法运行单元测试,使用$httpBackend
模拟响应。在测试使用$http
的控制器和指令时,我没有遇到任何问题,但在我的服务中,我遇到了困难
我一直遵循第一个答案中的模式:
i、 例如,使用$httpBackend
注册一个预期的请求,定义对它的响应,调用服务感兴趣的方法,然后刷新后端模拟
除非我注入$rootScope
,创建一个新的作用域,并在调用我感兴趣的服务方法后在其上运行$digest()
,否则我无法使其工作。这是我在测试使用$http
的控制器和指令时使用的模式,因为测试运行程序将指示没有要刷新的挂起请求。然而,我并不期望在服务中有这样的要求,因为范围
对我来说没有多大意义。此外,上面链接的问题中的答案并不表明这是明确必要的
今天早上,我在角度源中搜索了相当长的一段时间后,确定我的服务的$http
请求成功生成了一个promise对象,但是promise解析函数注册在$q中。当调用nextTick()
时,决不会触发。只有当我在servicesSpec中添加一行以摘要作用域对象时,才会触发所有
这是一个已知的问题吗?我使用的是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();
});
});
});
您的服务函数(getChartData)是什么样子的?getChartData
格式化一些数据并调用$http.post()
。即使是高度简化的$http.post(myUrl)形式代码>,serviceSpec要求我运行一个作用域。$digest()
,以便有一个挂起的刷新请求。您是否在Angular之外执行任何操作,例如使用jQuery插件或服务方法中的某些操作?实际上,包含该函数的源代码将有助于提出解决方案。