0

私は axios get の実装を嘲笑している冗談のテストをしています。

コンポーネントをレンダリングすると、API 呼び出しが送信されます。

呼び出し時にスピナーが表示されることをテストする必要があります。呼び出しが完了した後、スピナーが消えることをテストする必要があります。

モック プロミスがいつ解決されるかを知るにはどうすればよいですか?

axios.get.mockImplementationOnce(() => Promise.resolve({
data:{ query_scores: someData },
}));

const { queryByTestId, getByText } = renderWithRouter(
    <MyComponent />,
  );

  expect(queryByTestId('spinner')).not.toBeNull();

が呼び出されるまでにプロミスがまだ解決されていないことをどのように確認できますnot.toBeNullか?

注:私は反応テストライブラリを使用していますが、質問は一般的にモックプロミスの解決のタイミングに関連しています。

4

1 に答える 1

1

https://jestjs.io/docs/en/asynchronousによると、promise がいつ返されるかについてはそれほど時間の遅れはありませんが、テストから Promise を返す必要があり、Jest はその Promise を待機します。戻ります(どれだけ長くても)。

test('the data is peanut butter', () => {
  return fetchData().then(data => {
  expect(data).toBe('peanut butter');
  });
});

あなたの場合、jest.io ( https://jestjs.io/docs/en/mock-functions.html ) によると、次を使用して値を返します。

axios.get.mockResolvedValue(resp);

そしてそれに対してテストします

return Users.all().then(resp => expect(resp.data).toEqual(users));

Promise に時間遅延を追加する場合は、setTimeout を使用してリターンを制御できます。

const getData = async () => {
  return new Promise(resolve => {
     setTimeout(resolve, 1000);  //added arbitrary delay
   });
 };

次に、await を使用して getData 関数を呼び出すと、前後の応答をテストして、スピナーが期待どおりに表示されたり消えたりするかどうかを確認できます。

expect(queryByTestId('spinner')).not.toBeNull(); //expect spinner on render
await getData();
expect(queryByTestId('spinner')).toBeNull();  //expect no spinner on data returned
于 2019-02-21T15:00:32.430 に答える