Jest Mock(用于异步)文档似乎不测试实际代码

时间:2017-10-18 03:37:20

标签: javascript node.js unit-testing jest

我正在尝试基于the jest docs对异步测试进行模拟,但是我没有看到这个值,所以我必须遗漏一些基本的东西。下面是我的代码的简化版本和我的文件结构

 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 docs正在布局的基本结构,其中实际的API代码没有运行,而是被替换(不确定这是否是正确的单词) __mocks__/services.js中存在的代码。我必须在这里遗漏一些关键和基本的东西,因为这实际上并没有测试任何东西,只是我将模拟字符串传递给它并且它为它检查硬编码的夹具数据。它甚至无法访问 components / services.js 中的错误捕获代码。看来我可以很容易地在没有模拟的情况下做像

这样的事情
expect(rawResponses.get(requestPayloadKey)).toBe(rawResponseOne)

我会在使该测试有用的文档中遗漏什么?

1 个答案:

答案 0 :(得分:2)

您的示例与jest docs中的示例不同。他们有以下几点:

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

他们通过模拟网络请求(user.js)来测试request.js中的逻辑。你正在嘲笑你正试图测试哪一个没用的东西,正如你自己所说的那样。

与他们的例子相同的是:

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

在这里你模仿services.js wihin data-processor.test.jsjest.mock('../services')),并测试data-processor.js的数据处理逻辑,它依赖于services.js来获取它数据

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