javascript - 在 Jest 中测试嵌套的 promise

标签 javascript unit-testing promise async-await jestjs

我在 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 的较早测试通过了,但是我将一个 Promise 传递给 sendItems 的后一个测试失败了,因为 sendItemsResp 未定义。如果我在运行后一个测试时将 console.log(saveItems(result) 放在 sendItems 函数中,我会得到一个未决的 promise ,所以我假设我需要一些如何在此测试中解决该 promise 。但是,我不知道该怎么做。有人可以帮忙吗?

最佳答案

items.then(result => {

中缺少 return 语句

此外,您还可以执行 const sendItems = items => Promise.resolve(items).then(saveItems)

.then.catch 也是多余的。

关于javascript - 在 Jest 中测试嵌套的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50028406/

相关文章:

javascript - 带提示的 Puppeteer,忽略其余功能

javascript - 理解 JS Promises

javascript - 带负数的 Array.slice 安全吗?

javascript - 使用 Raphael 在图像周围绘制圆形边框

unit-testing - 使用 Joda Time 进行 Grails Controller 单元测试

unit-testing - 未注入(inject)模拟对象

unit-testing - 如何对Arduino代码进行单元测试?

javascript - 按住按钮时向上/向下滚动

javascript - 自动运行CSS过渡

javascript - 如何将现有的回调 API 转换为 Promise?