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插件或服务方法中的某些操作?实际上,包含该函数的源代码将有助于提出解决方案。