在前端开发的过程中,测试是一个不可避免的工作,而 Jest 是一个广为使用的测试框架。在进行单元测试时,有时需要一些模块来协助测试,但这些模块又无法在测试的环境中使用,这时就需要使用 Jest 中的 mock 功能来模拟这些模块。
下面将介绍如何在 Jest 中 mock require() 的模块。
require() 被 mock 的情形
在 Jest 测试中,有一个常见的例子:在测试某个模块时,需要模拟另一个模块的返回值。
例如,假设有这段代码:
const getUserData = require('./userData'); const getUserName = require('./userName'); function getUser() { const userData = getUserData(); const userName = getUserName(userData.id); return `${userName}: ${userData.age} years old`; }
在测试 getUser() 函数时,需要模拟 getUserData() 和 getUserName(id) 函数的返回值。
使用 Jest 的 mock 功能
首先,需要使用 jest.mock() 来 mock 上面例子中的两个模块:
jest.mock('./userData'); jest.mock('./userName');
接着,需要对这两个模块的方法进行 mock:
const getUserData = require('./userData'); const getUserName = require('./userName'); getUserData.mockReturnValue({ id: '123', age: 18 }); getUserName.mockImplementation(id => 'Jane');
getUserData.mockReturnValue() 可以设置 getUserData() 函数的返回值,getUserName.mockImplementation() 则可以实现 getUserName(id) 函数。
最后,即可进行测试:
const getUser = require('./getUser'); test('getUser', () => { expect(getUser()).toBe('Jane: 18 years old.'); });
mock 一个模块的默认导出
有时候,模块的导出不是一个函数,而是一个变量或对象。
例如,有一个模块:
const limit = 100; const getLimit = () => limit; module.exports = { getLimit, setLimit: newLimit => limit = newLimit, };
在测试时,需要 mock 这个模块的默认导出:
-- -------------------- ---- ------- ------------------ -- -- - ----- - -------- - - ------------------------------- ------ - --------- --------- ---------- -- --- ----- --- - -----------------展开代码
其中,jest.fn() 可以创建一个可以用作函数的 mock,require.requireActual() 可以获取实际的模块。
这样,就可以对 getLimit() 和 setLimit(newLimit) 进行测试了。
总结
在 Jest 中 mock require() 的模块,可以实现单元测试的需要,使测试更为完整和准确。需要注意的是,mock 的操作需要进行到每个测试片段代码段的最前面,否则会出现 mock 失效或冲突的问题。
以上是本文对 Jest 测试框架中,如何 mock require() 的模块的详细介绍,希望读者可以通过本文学到更多的测试技巧,并提高自身的测试能力。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65221fb595b1f8cacd982b82