在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测试包含嵌套组件的反应组件?

如何测试嵌套组件的样式 jest-styled-components

如何对 Vue 应用程序中的嵌套操作进行单元测试?

Oboe.js、Promises 和 Jest

如何使用 Jest 和/或 Enzyme 获取嵌套在 React 组件中的元素的属性?