2

promise を使用して json ファイルを解決するファクトリがあります。最初にこのファイルを解決し、再度呼び出されたときに結果を返す必要があります。

工場はこちら

app.factory('getServerConfig', function ($q, $http, serverConfig) {

  return function (fileName) {
    var deferred = $q.defer();

    if (serverConfig.loaded) {
      deferred.resolve("alreadyLoaded");
    } else {
      $http.get(fileName).then(function (result) {
        serverConfig.setConfig(result.data);
        deferred.resolve("loaded");
      }, function (result) {
        deferred.reject();
      });
    }
    return deferred.promise;
  };
})

そして、私はそれをテストする方法:

it('should say hallo to the World', inject(function(getServerConfig) {
    var promiseResult;

    getServerConfig("server-config.json").then(function (result) {
      promiseResult = result;
    });

    rootScope.$apply();
    expect(promiseResult).toBe('loaded');
}));

残念ながら、promiseResult が設定されていないようです。これがコード付きのプランカーです: http://plnkr.co/edit/uRPCjuUDkqPRAv07G5Nx?p=preview

4

1 に答える 1

3

問題は、 $httpBackend がflush()( Flushing HTTP requests を$http参照) を要求するため、テストで非同期動作を模倣できることです。

これを解決するには、参照を保存$httpBackend(または再度注入) し、リクエストが行われた後に $httpBack.flush() を呼び出します。

見て:

it('should say hallo to the World', inject(function(getServerConfig, $httpBackend) {
  var promiseResult;

  getServerConfig("server-config.json").then(function (result) {
    promiseResult = result;
  });

  $httpBackend.flush();
  expect(promiseResult).toBe('loaded');
}));

ほとんどの仕様で使用$httpBackendする場合は、ローカル変数に格納することを検討し、beforeEach.

于 2013-04-05T12:32:57.603 に答える