首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种方法可以更改所需依赖项的模拟值?

是否有一种方法可以更改所需依赖项的模拟值?
EN

Stack Overflow用户
提问于 2019-06-06 15:47:31
回答 2查看 741关注 0票数 1

我正面临着一个我无法独自解决的问题,也许你们中的一些人也面临着同样的问题。

让我向你们展示我想要做的事情,下面是模拟:

代码语言:javascript
复制
let mockConfig = {name: 'dude'};
jest.mock('../../../configManager', () => mockConfig);

configManager是我要测试的函数的依赖项。

它运行得很好,但我希望在另一个测试中更改configManager的返回对象,这样测试函数的行为就会有所不同。

让我展示给你们看,这是我正在测试的函数:

代码语言:javascript
复制
const config = require('../../../configManager');

module.exports = () => {
if (config.name === 'dude') {
  do stuff;
}

if (config.name === 'dudette') {
  do something else;
}

因此,通常情况下,我希望将config.name更改为'dudette',以便能够测试函数的第二部分。

当然,当我想用导入的函数来完成这个任务时,我只需要:

代码语言:javascript
复制
let mockJsonQueryResult = { value: 'stuff' };
jest.mock('json-query', () => jest.fn(() => mockJsonQueryResult));

然后在测试中,我直接将另一个值设置为mockJsonQueryResult:

代码语言:javascript
复制
mockJsonQueryResult = { value: 'hotterStuff' };

但是,对于返回对象的依赖关系,以及返回函数的依赖关系,我找不到任何方法来做到这一点,没有问题。

有什么办法吗?

提前感谢!

编辑:这与@Dor Shinar建议的how to change jest mock function return value in each test?不同,因为他的问题是模拟一个函数,即使它在返回的对象内--它仍然是一个函数,我只想在返回的对象中更改一个值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-07 15:02:39

因此,我找到了一个我不完全满意的解决方案,但它有效:

我只需设置原始的full对象,然后在调用要测试的函数之前,通过直接设置它们来更改特定属性的值。

示例:

代码语言:javascript
复制
let mockConfig = { person: { name: 'dude', origin: {country: 'France'} } };
jest.mock('../../../configManager', () => mockConfig);


mockConfig.person = {};
mockConfig.person.name = 'dudette';
票数 0
EN

Stack Overflow用户

发布于 2019-06-08 00:45:19

您根本不需要模拟模块。

如果您的模块导出只是一个具有属性值的对象,那么只需根据需要更改属性。

下面是一个简单的工作示例来演示:

configManager.js

代码语言:javascript
复制
module.exports = {
  name: 'original'
}

code.js

代码语言:javascript
复制
const config = require('./configManager');

module.exports = () => `name: ${config.name}`;

code.test.js

代码语言:javascript
复制
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!
})

详细信息

模块绑定不能直接更改为其他内容:

代码语言:javascript
复制
const config = require('./configManager');
config = { name: 'mock' };  // <= this doesn't work

...but您可以更改表示模块绑定的对象的属性:

代码语言:javascript
复制
const config = require('./configManager');
config.name = 'mock';  // <= this works!

...and使用该模块的任何代码都将自动看到更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56481071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档