0

SongsAPI から毎秒曲を取得するこのファクトリを呼び出します。

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 は新しい期待値を作成し、/api/songs.json に対して GET リクエストが行われたときに特定のオブジェクトで応答するように angular に指示します。何をすべきかを登録しているだけですが、ここではGETリクエストは発行されません。

サービスでポーラー関数をすぐに呼び出すため、サービスが読み込まれると http リクエストが起動します。

また、http リクエストが発行される前 (つまり、サービスがロードされる前) に、レスポンスをスタブする必要があります。pearlJam モジュールを読み込む -> expectGET で期待値を登録する -> Songs サービスを読み込む

ここでは、コードを最も重要な部分まで削除しましたが、Config サービスと $timeout サービスを再注入しても機能するはずですhttp://plnkr.co/edit/lbkxjTJbEjEXIzbyNPVF?p=preview

于 2013-08-11T12:14:57.240 に答える