我遇到了一个我自己无法解决的问题,也许你们中的一些人也遇到了同样的问题。
让我告诉你我想做什么,这是模拟:
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?不同,因为他的问题是模拟一个函数,即使它在返回的对象中仍然是一个函数,我只想更改一个返回的对象中的值。
答案 0 :(得分:0)
因此,我找到了一个我不完全满意的解决方案,但是它可以起作用:
我只需设置原始的完整对象,然后为我的测试更改特定属性的值,方法是在调用要测试的函数之前直接设置它们。
示例:
let mockConfig = { person: { name: 'dude', origin: {country: 'France'} } };
jest.mock('../../../configManager', () => mockConfig);
mockConfig.person = {};
mockConfig.person.name = 'dudette';
答案 1 :(得分:0)
您根本不需要模拟模块。
如果模块导出只是具有属性值的对象,则只需根据需要更改属性。
这是一个简单的示例来演示:
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
...但是您可以更改表示模块绑定的对象的属性:
const config = require('./configManager');
config.name = 'mock'; // <= this works!
...以及使用该模块的任何代码都会自动看到更改。