【问题标题】:Testing nested promises in Jest在 Jest 中测试嵌套的 Promise
【发布时间】:2018-10-06 07:01:18
【问题描述】:

我在 Jest 中测试以下函数时遇到问题。我有一个可以将数组或承诺作为参数的函数。无论哪种方式,我都会将该参数传递给 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 的较早测试通过了,但由于sendItemsResp 未定义,我将Promise 传递给sendItems 的后一个测试失败。如果我在运行后一个测试时将console.log(saveItems(result) 放入sendItems 函数中,我会得到一个未决的承诺,所以我假设我需要一些如何在这个测试中解决这个承诺。但是,我不知道该怎么做。有人可以帮忙吗?

【问题讨论】:

    标签: javascript unit-testing promise async-await jestjs


    【解决方案1】:

    items.then(result => { 中缺少 return 语句

    另外,你也可以const sendItems = items => Promise.resolve(items).then(saveItems)

    .then.catch 也是多余的。

    【讨论】:

    • 不敢相信我错过了return 声明。我想知道为什么这在本地工作?我不明白你后面对const sendItems = items => Promise.resolve(items).then(saveItems) 的评论。我会把它放在哪里,它会给我带来什么?
    • 它将替换整个 sendItems 方法,只是它的一个较短版本。解释:sendItems 总是返回一个Promise,这个较短的版本使它适用于两种用例。当 items 是 Array 时,它将变为 Promise.resolve([]).then(),当它已经是 Promise 时,它将是 Promise.resolve(Promise.resolve([])).then(),这将产生相同的结果。
    猜你喜欢
    • 2020-10-19
    • 2020-03-08
    • 2017-11-13
    • 1970-01-01
    • 2020-04-21
    • 2018-08-25
    • 2018-07-06
    • 2013-03-30
    • 2018-10-19
    相关资源
    最近更新 更多