有没有办法更改所需依赖项的模拟值?

时间:2019-06-06 15:47:31

标签: jestjs

我遇到了一个我自己无法解决的问题,也许你们中的一些人也遇到了同样的问题。

让我告诉你我想做什么,这是模拟:

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?不同,因为他的问题是模拟一个函数,即使它在返回的对象中仍然是一个函数,我只想更改一个返回的对象中的值。

2 个答案:

答案 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!

...以及使用该模块的任何代码都会自动看到更改。