2

ここにある Redux チュートリアルに取り組んでいます。

私が作成したアプリには、Date.now() が呼び出される receivePosts 関数でここに示されているような副作用のあるアクションがあります。

副作用は、非同期関数が完了した後にトリガーされます。自分のアプリでこの非同期テストに従うとき。次のような応答が返ってきます。

actual: 
{ 
  type: 'REQUEST_LEAGUE_SUCCESS',
  receivedAt: 1453991947254,
  league: 'Div 3',
  resultsTable: [ [Object], [Object] ] 
},

expected: 
{ 
  type: 'REQUEST_LEAGUE_SUCCESS',
  league: 'Div 3',
  receivedAt: 1453991947235,
  resultsTable: [ [Object], [Object] ]
}

予想されるアクションの日付が実際のアクションの日付と等しくない場合。私の期待される行動には、次のようなものがあります。

receivedAt: Date.now()

私のコードの構造は、Redux チュートリアルにあるコードとまったく同じですが、私のアクション作成者がこの副作用を持っていることは別として。

私の質問は次のようなものです。これらの副作用を処理してテストをパスするにはどうすればよいですか?

4

3 に答える 3

0

次のように Date.now() 関数をモックできます。

describe('>>> Test Name', () => {
    const literallyJustNow = Date.now();
    const realDateNow = Date.now.bind(global.Date);
    const dateNowStub = jest.fn(() => literallyJustNow);

    beforeEach(() => {
        global.Date.now = dateNowStub;
    });

    afterEach(() => {
        global.Date.now = realDateNow;
    });

    it('... your tests ...', () => { ... });
});
于 2019-01-28T07:31:29.813 に答える
0

現在の時刻を取得することに依存するテスト コードはお勧めできません。日付をモックアウトまたは挿入できるように、書き直す必要があります。それを行ういくつかの良い例 (単体テスト、テスト可能なコードの書き方、およびそれが重要である理由)。この記事は C# ベースですが、ここでも同じ概念が当てはまります。

于 2016-01-28T18:31:43.460 に答える
-1

アクションをディスパッチしてから応答を受信するまでにある程度の時間が必然的に経過するため、テストにある程度の許容範囲を組み込む必要があると思います。あなたがそれを偽造したとしても、実行時間にはまだ違いがあります。実際にこれを行う方法は、アサーション ライブラリによって異なります。

于 2016-01-28T17:17:19.337 に答える