在Jest中测试嵌套的promise

问题描述 投票:2回答:1

我在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,我会得到一个待定的承诺,所以我假设我需要一些如何让这个承诺在这个测试中解决。但是,我不知道该怎么做。有人可以帮忙吗?

javascript unit-testing promise async-await jest
1个回答
3
投票

items.then(result => {错过了const sendItems = items => Promise.resolve(items).then(saveItems)声明

此外,你可以做.then

.catch和qazxswpoi也是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.