我正在尝试基于 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/