我正面临着一个我无法独自解决的问题,也许你们中的一些人也面临着同样的问题。
让我向你们展示我想要做的事情,下面是模拟:
let mockConfig = {name: 'dude'};
jest.mock('../../../configManager', () => mockConfig);configManager是我要测试的函数的依赖项。
它运行得很好,但我希望在另一个测试中更改configManager的返回对象,这样测试函数的行为就会有所不同。
让我展示给你们看,这是我正在测试的函数:
const config = require('../../../configManager');
module.exports = () => {
if (config.name === 'dude') {
do stuff;
}
if (config.name === 'dudette') {
do something else;
}因此,通常情况下,我希望将config.name更改为'dudette',以便能够测试函数的第二部分。
当然,当我想用导入的函数来完成这个任务时,我只需要:
let mockJsonQueryResult = { value: 'stuff' };
jest.mock('json-query', () => jest.fn(() => mockJsonQueryResult));然后在测试中,我直接将另一个值设置为mockJsonQueryResult:
mockJsonQueryResult = { value: 'hotterStuff' };但是,对于返回对象的依赖关系,以及返回函数的依赖关系,我找不到任何方法来做到这一点,没有问题。
有什么办法吗?
提前感谢!
编辑:这与@Dor Shinar建议的how to change jest mock function return value in each test?不同,因为他的问题是模拟一个函数,即使它在返回的对象内--它仍然是一个函数,我只想在返回的对象中更改一个值。
发布于 2019-06-07 15:02:39
因此,我找到了一个我不完全满意的解决方案,但它有效:
我只需设置原始的full对象,然后在调用要测试的函数之前,通过直接设置它们来更改特定属性的值。
示例:
let mockConfig = { person: { name: 'dude', origin: {country: 'France'} } };
jest.mock('../../../configManager', () => mockConfig);
mockConfig.person = {};
mockConfig.person.name = 'dudette';发布于 2019-06-08 00:45:19
您根本不需要模拟模块。
如果您的模块导出只是一个具有属性值的对象,那么只需根据需要更改属性。
下面是一个简单的工作示例来演示:
configManager.js
module.exports = {
name: 'original'
}code.js
const config = require('./configManager');
module.exports = () => `name: ${config.name}`;code.test.js
const config = require('./configManager');
const func = require('./code');
test('func', () => {
expect(func()).toBe('name: original'); // Success!
config.name = 'dude';
expect(func()).toBe('name: dude'); // Success!
config.name = 'dudette';
expect(func()).toBe('name: dudette'); // Success!
})详细信息
模块绑定不能直接更改为其他内容:
const config = require('./configManager');
config = { name: 'mock' }; // <= this doesn't work...but您可以更改表示模块绑定的对象的属性:
const config = require('./configManager');
config.name = 'mock'; // <= this works!...and使用该模块的任何代码都将自动看到更改。
https://stackoverflow.com/questions/56481071
复制相似问题