我正在尝试基于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)
答案 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.js
(jest.mock('../services')
),并测试data-processor.js
的数据处理逻辑,它依赖于services.js
来获取它数据
这意味着,您需要将处理数据的逻辑与获取数据的代码分开。获取数据的方式是实现细节,对于测试处理数据的逻辑并不重要,因此也就是模拟。这不是特定于jest,而是适用于将代码构造为通常可测试的。