1

我的应用程序中有一项服务,它$http根据特定规范使用格式化请求。我一直在尝试对服务的方法运行单元测试,$httpBackend用于模拟响应。在测试使用$http.

我一直在遵循第一个答案中的模式: AngularJS - Testing service method that uses $http service

即,注册一个预期的请求$httpBackend,定义一个响应,调用感兴趣的服务方法,然后刷新后端模拟。

除非我在调用我感兴趣的服务方法后注入$rootScope、创建一个新范围并在其上运行 a ,否则我无法让它工作。$digest()这是我在测试使用 的控制器和指令时使用的模式$http,因为测试运行程序将指示没有待处理的刷新请求。但是,我没想到服务中有这个要求,因为scope对我来说没有多大意义。此外,上面链接的问题的答案并不表明这是明确必要的。

今天早上在角度源中闲逛了相当长的时间后,我确定已成功为我的服务请求创建了一个承诺对象,但在' 的调用中$http注册的承诺解决函数永远不会触发。只有当我在我的 servicesSpec 中添加一行来消化一个范围对象时,一切都会触发......$q.whennextTick()

这是一个已知的问题?我正在使用 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();
    });


  });

});
4

0 回答 0