6

フィード (RSS) アプリケーションを開発するときに、AngularJS 単体テストで遊んでいます。フィードは、リモートの rss データを取得して解析し、解析されたアイテムを保存できます。RSS フェッチをテストするために、$httpBackend モックを使用します。

beforeEach(inject(function (_$httpBackend_, _feedMock_, _mockConfig_) {
    _$httpBackend_.when('GET', _mockConfig_.FEED_URL).respond(_feedMock_);
}));

そしてその下

$httpBackend.expectGET(mockConfig.FEED_URL);
feed.fetch();
$httpBackend.flush();

それは正常に動作します。

しかし、更新された RSS データを取得して新しい項目を追加することで、Feed がその状態を実現できるようにする必要があります。したがって、フィードは同じリクエストを行いますが、新しく更新されたデータを取得します。次のような方法でサーバー定義を再作成しようとしています:

$httpBackend.when('GET', _mockConfig_.FEED_URL).respond(feedMockUpdated);

次に、expect と flush で同じ操作を行いますが、$httpBackend の応答は、新しい (feedMockUpdated) ではなく、古いデータ (feedMock) で行います。$httpBackend を同じリクエストで異なるデータで応答させるにはどうすればよいですか?

4

1 に答える 1

17

respond静的データセットだけでなく、関数を使用して設定できます。

ドキュメントから:

http://docs.angularjs.org/api/ngMock.$httpBackend

Respond – {function([status,] data[, headers])|function(function(method, url, data, headers)} – Respond メソッドは、返される静的データのセットまたは配列を返すことができる関数を取ります応答ステータス (数値)、応答データ (文字列)、および応答ヘッダー (オブジェクト) を含みます。

あなたのケースで私が理解しているように、同じエンドポイントが後の呼び出しで異なるデータを返すようにしたい場合は、次のようなことを試すことができます。これは、後続の呼び出しでデータを切り替える単純なカウンターを実装しているだけです。

var rssCalled = 0;

$httpBackend.when('GET', _mockConfig_.FEED_URL).respond(function(method, url, data, headers){
    if(rssCalled === 0) {
        rssCalled++;
        return [200, feedMock, {}];
    } else {
       return [200, feedMockUpdated, {}];
    }
});
于 2013-04-29T23:29:39.100 に答える