非同期に実行するコードをJestでテスト

Lachlan Miller
3 min readAug 20, 2017

--

Jestは、Facebookが開発したテストフレームワークです。Jestは、複雑な設定なしにJavaScript、さらにReactとVueのコンポーネントをテストするためのフレームワークです。

JavaScriptでは、コードを非同期に実行することが多いです。それを認めて、Jestで非同期的に実行するコードをテストするためにいくつかの機能が含まれます。

二つの例をあげます。AxiosというHTTPクライエントを使います。

yarn init -y
yarn add axios jest
// package.json
"scripts": {
"test": "jest"
}

api.test.jsというファイルを作ります。Jestは、.testが入るファイルを自動に探して実行します。

// api.test.js
const axios = require('axios')
function getApiData() => {
return axios.get('https://jsonplaceholder.typicode.com/posts/1')
}

JsonPlaceholderは、誰でも使えるテストのためのAPIです。以下のようなレスポオンスがきます。

{
"userId": 1,
"id": 1,
"title": ".....",
"body": "...."
}

getApiData()をJestでテストします。

test('the post id is 1', () => {
expect.assertions(1)
return getApiData(1).then(res => {
expect(res.data.id).toBe(1)
})
})

expect.assertions で、想定した数のアサーションが呼ばれたことを確認できます。yarn test で実行します。

async/awaitも使えます。async/awaitの方が読みやすいと思います。async/awaitを使うと、前の関数が変わります。testを定義する際はasync を書かないと動けますん。

function getPostId() => {
return axios.get('https://jsonplaceholder.typicode.com/posts/')
.then(res => res.data.id)
}
test('the post id is 1', async () => {
expect.assertions(1)
const id = await getPostId(1)
expect(id).toBe(1)
})

テストを実行すると、本当のテータベースのような外部のリソースにアクセスするのが遅く、その代わりにモックデータを使えます。Jestでモジュールを追加せずにできます。以上のテストを、スタブしてモックデータを返します。

getPostId = jest.fn()
getPostId.mockReturnValue(1)
test('the post id is 1', async () => {
expect.assertions(1)
const id = await getPostId(1)
expect(id).toBe(1)
})

次の投稿では、VueのコンポーネントをJestでテストしてみたいと思います。

--

--

Lachlan Miller
Lachlan Miller

Written by Lachlan Miller

I write about frontend, Vue.js, and TDD on https://vuejs-course.com. You can reach me on @lmiller1990 on Github and @Lachlan19900 on Twitter.