在Jest中测试嵌套的promise
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Jest中测试嵌套的promise相关的知识,希望对你有一定的参考价值。
我在Jest中测试以下功能时遇到了麻烦。我有一个函数,可以将数组或promise作为参数。无论哪种方式,我将该参数传递给axios调用,唯一的区别是如果参数是一个promise,我会在将.then()
传递给调用之前调用sendItems.js
。
这一切都很好,花花公子,但我在编写单元测试时遇到了麻烦,以确认这是有效的。
import axios from 'axios'
export const saveItems = () => {
return axios({
url: '/stuff/graphql',
method: 'post',
credentials: 'same-origin',
data: {
whatever: 'yo'
}
})
.then(response => {
return response
})
.catch(err => {
return err
})
}
export const sendItems = items => {
if(items instanceof Promise){
items.then(result => {
return saveItems(result)
})
.catch(err => {
return err
})
}
else{
return saveItems(items)
}
}
export default { sendItems, saveItems }
/* global jest, describe, beforeAll, beforeEach, expect, test */
import axios from 'axios'
import MockAdapter from 'axios-mock-adapter'
describe('save items', () => {
let sendItems, mock, items
beforeAll(() => {
sendItems = require('../services/sendItems.js').sendItems
mock = new MockAdapter(axios)
items = [
{
pid: '1',
name: 'shoe'
}
]
})
test('returns 200 when the call to save items is successful', async () => {
const response = {
status: 200,
data: 'success'
}
mock.onPost('stuff/graphql').reply(200, response)
const sendItemsResp = await sendItems(items)
expect(sendItemsResp.data.status).toEqual(response.status)
})
test('correctly resolves the value of input passed to the service, if it is a Promise', async() => {
const response = {
status: 200,
data: 'success'
}
items = Promise.resolve([{"p": 1}, {"p": 2}])
mock.onPost('stuff/graphql').reply(200, response)
const sendItemsResp = await sendItems(items)
expect(sendItemsResp.response.status).toEqual(response.status)
// expect(saveItems).toHaveBeenCalledWith([{"p": 1}, {"p": 2}])
})
})
测试看起来像这样:
sendItems
我将一个数组传递给sendItems
的早期测试通过了,但是我将一个Promise传递给sendItemsResp
的后一个测试失败了,因为console.log(saveItems(result)
未定义。如果我在运行后一个测试时在sendItems
函数中放了一个return
,我会得到一个待定的承诺,所以我假设我需要一些如何让这个承诺在这个测试中解决。但是,我不知道该怎么做。有人可以帮忙吗?
在items.then(result => {
错过了const sendItems = items => Promise.resolve(items).then(saveItems)
声明
此外,你可以做.then
.catch
和qazxswpoi也是多余的。
以上是关于在Jest中测试嵌套的promise的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Promise.all 使用 jest 为多个提取设置测试
如何使用react-test-renderer和jest测试包含嵌套组件的反应组件?