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的一般。

Interesting Posts