0

我有这个工厂Songs,它每秒从 API 中获取歌曲:

angular.module('pearlJam')
  .factory('Songs', function($http, $timeout, Config){
      var response = {list: []};
      var onSuccess = function(result){
        response.list = result.data.data;
        $timeout(poller, Config.pollingTimeout);
      };

      var poller = function(){
        $http.get('api/songs.json', Config.httpOptions).then(onSuccess);
      };

      poller();
      return {all: response};
    });

我想对其进行测试,我尝试过如下所示,但我认为我以错误的方式注入服务。当我尝试运行测试时,它输出Error: No pending request to flush !.这就像它没有进行http调用一样。

describe('Songs', function(){
    var httpStub, localService;
    beforeEach(module('pearlJam'));

    beforeEach(inject(function(_$httpBackend_, Songs){
      httpStub = _$httpBackend_;
      localService = Songs;
    }));

    it('lists all songs', function(){
      var httpResponse = { data: [1]};
      httpStub.whenGET('api/songs.json').respond(httpResponse);

      var serviceResponse = localService.all;
      httpStub.flush();

      expect(serviceResponse).toBe([1]);
    });
  });
4

2 回答 2

2

expectGET 创建一个新的期望,告诉 Angular 在向 /api/songs.json 发出 GET 请求时响应给定的对象。它只是注册它应该做的事情,但这里没有触发 GET 请求。

因为您立即在服务中调用 poller 函数,所以在加载服务时会触发 http 请求。

并且您必须在触发 http 请求之前(即在加载服务之前)对响应进行存根。加载pearlJam模块->用expectGET注册期望->加载歌曲服务

在这里,我将您的代码剥离到最重要的部分,但重新注入 Config 和 $timeout 服务应该也可以工作http://plnkr.co/edit/lbkxjTJbEjEXIzbyNPVF?p=preview

于 2013-08-11T12:14:57.240 回答
1

$httpBackend.flush()方法仅适用于请求期望,例如expectGET.

whenGET方法允许您模拟后端并劫持请求以响应特殊内容,但它不计入刷新。

如果您flush()没有期望地调用,它会抛出您遇到的错误。

于 2013-08-08T14:46:48.843 回答