javascript - Jest Mock(用于异步)文档似乎没有测试实际代码

标签 javascript node.js unit-testing jestjs

我正在尝试基于 the jest docs 进行异步测试模拟,但我没有看到它的值(value),所以我一定错过了一些基本的东西。下面是我的代码和文件结构的简化版本

📂 components
   📂 __mocks__
     📄 services.js
   📂 __tests__
     📄 services.test.js
   📄 services.js

components/services.js

async function getData (req, res) {
  const result = await axios.get(url)
  res.json(result.data)
}

components/__mocks__/services.js

const requestPayloadKey = {
  kindOf: 'complex',
  objectAs: 'key'
}
const rawResponseOne = {
  expected: 'response'
}
const rawResponses = new Map() // should probably be an object. i started with map before remembering the keys must be the same, not just deeply equal but this works for now
rawResponses.set(JSON.stringify(requestPayload), rawResponseOne)

export default function(requestPayload) {
  return new Promise((resolve, reject) => {
    process.nextTick(
      () =>
      rawResponses.has(JSON.stringify(requestPayloadKey)) ?
      resolve(rawResponses.get(JSON.stringify(requestPayloadKey))) :
      reject({
        error: 'response not found'
      })
    )
  })
}

components/__tests__/services.test.js

jest.mock('../services')
import getData from '../services' // I believe this should now be coming from __mocks__
const requestPayload = {
  kindOf: 'complex',
  objectAs: 'key'
}
const rawResponseOne = {
  expected: 'response'
}
describe('services', () => {
  it('should return raw data from service', () => {
    expect.assertions(1)
    return getData(requestPayload).then(data =>
      expect(data).toEqual(rawResponseOne)
    )
  })
})

这似乎是 Jest 文档所展示的基本结构,其中实际的 API 代码并未运行,而是被替换为(不确定这是否是正确的词) __mocks__/services.js 中存在的代码。我一定在这里遗漏了一些关键和基本的东西,因为这实际上并没有测试任何东西,只是我向模拟传递了一个字符串,它检查了一段硬编码的固定数据。它甚至无法访问 components/services.js 中的错误捕获代码。看来我可以在没有模拟的情况下轻松地做类似的事情

expect(rawResponses.get(requestPayloadKey)).toBe(rawResponseOne)

我从文档中遗漏了哪些内容,使该测试变得有用?

最佳答案

您的示例与 Jest 文档中的示例不同。他们拥有以下内容:

📂 __mocks__
  📄 request.js
📂 __tests__
  📄 user-test.js
📄 user.js
📄 request.js

他们通过模拟网络请求(在 request.js 中)来测试 user.js 中的逻辑。正如您自己所说,您正在 mock 您试图测试的东西,但它没有用。

与他们的示例等效的是:

📂 components
   📂 __mocks__
     📄 services.js
   📂 __tests__
     📄 data-processor.test.js
   📄 services.js
   📄 data-processor.js

在这里,您可以在 data-processor.test.js 中模拟 services.js (使用 jest.mock('../services')),并测试 data-processor.js 的数据处理逻辑,该逻辑依赖于 services.js 来获取数据。

这意味着,您需要将处理数据的逻辑与获取数据的代码分开。获取数据的方式是一个实现细节,对于测试处理数据的逻辑并不重要,因此是模拟。这并不特定于 Jest ,而是适用于构建可测试的代码。

关于javascript - Jest Mock(用于异步)文档似乎没有测试实际代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46802389/

相关文章:

javascript - 我可以使用 res.send(foo) 两次吗?

android - 不涉及第 3 方应用程序时需要 OAUTH2 吗?

angularjs - 单元测试私有(private)方法

javascript - javascript函数之间的差异

javascript - 找不到 Npm 模块 ""。安装了吗?

php - 如何使用 Codeception 将鼠标悬停在元素上?

Silverlight 单元测试(数据绑定(bind)、MVVM)

javascript - jQuery 单击显示/隐藏使用 2 个单独的元素问题

javascript - jquery获取select中的选择选项

javascript - Deftjs promise 完成()不工作