Jest Mock(用于asynchronous)文档似乎不testing实际的代码
我试图做一个基于笑话文档的asynchronoustesting嘲笑,但我没有看到的价值,所以我必须失去一些根本。 下面是我的代码和我的文件结构的简化版本
📂 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) ) }) })
这似乎是笑话文档的基本结构,其中实际的API代码没有运行,而是被__mocks__/services.js
的代码取代 (不知道这是正确的词) 。 我必须在这里丢失一些重要和基本的东西,因为这实际上不是testing任何东西,只是我通过模拟一个string,并检查硬编码的夹具数据。 它甚至无法访问components / services.js中的错误捕获代码。 看来我可以像没有模拟一样轻松做一些事情
expect(rawResponses.get(requestPayloadKey)).toBe(rawResponseOne)
我从文档中错过了什么,将使这个testing有用?
你的例子与jest docs中的类似。 他们有以下几点:
📂 __mocks__ 📄 request.js 📂 __tests__ 📄 user-test.js 📄 user.js 📄 request.js
他们通过嘲笑networking请求(在request.js
)来testinguser.js
的逻辑。 你正在嘲笑你正在试图testing的东西,这是没用的,正如你自己所说的那样。
与他们的例子相同的东西就是这样的:
📂 components 📂 __mocks__ 📄 services.js 📂 __tests__ 📄 data-processor.test.js 📄 services.js 📄 data-processor.js
在这里,你将模拟services.js
wihin data-processor.test.js
(与jest.mock('../services')
),并testingdata-processor.js
数据处理逻辑依赖于services.js
获得其数据。
这意味着,你需要保持你的数据处理逻辑独立于获取数据的代码。 你得到数据的方式是一个实现细节,对testing处理它的逻辑来说并不重要,因此是模拟的。 这并不是特定于开玩笑,而是适用于将代码构build为可testing的一般。