У меня проблемы с тестированием следующей функции в Jest.У меня есть функция, которая может принимать массив или обещание в качестве аргумента.В любом случае, я передаю этот аргумент в вызов axios, единственное различие заключается в том, что если аргумент является обещанием, я вызываю .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
, не выполняется из-за того, что sendItemsResp
не определено.Если при выполнении последнего теста я добавлю console.log(saveItems(result)
в функцию sendItems
, я получу ожидающее обещание, поэтому я предполагаю, что мне нужно кое-как разрешить это обещание в этом тесте.Однако я не знаю, как это сделать.Кто-нибудь может помочь?