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

11 浏览
0 Comments

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

我面临一个无法独自解决的问题,也许你们中的一些人曾经遇到过相同的问题。\n让我展示一下我正在尝试做的事情,这是一个模拟:\n

let mockConfig = {name: 'dude'};
jest.mock('../../../configManager', () => mockConfig);

\nconfigManager是我试图测试的函数的一个依赖项。\n它工作得很好,但我想在另一个测试中更改configManager的返回对象,以便测试函数的行为不同。\n让我向你展示,这是我正在测试的函数:\n

const config = require('../../../configManager');
module.exports = () => {
if (config.name === 'dude') {
  做一些事情;
}
if (config.name === 'dudette') {
  做另一些事情;
}

\n所以,通常情况下,我想要将 config.name 更改为 \'dudette\',以便能够测试函数的第二部分。\n自然而然地,当我想要对导入的函数进行此操作时,我只需执行以下操作:\n

let mockJsonQueryResult = { value: 'stuff' };
jest.mock('json-query', () => jest.fn(() => mockJsonQueryResult));

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

mockJsonQueryResult = { value: 'hotterStuff' };

\n但是,我发现无法以这种方式处理返回对象的依赖项,对于返回函数的依赖项没有问题。\n有没有任何办法可以做到这一点?\n提前感谢!\n编辑:这与how to change jest mock function return value in each test?不同,如@Dor Shinar所建议的,因为他的问题是模拟一个函数,即使它在返回的对象中,它仍然是一个函数,我只是想改变返回对象中的一个值。

0
0 Comments

问题的原因是在测试中需要改变一个必需依赖的模拟值,但是直接改变模拟值是行不通的。解决方法是改变模块绑定对象的属性值。

可以通过改变模块绑定对象的属性值来达到改变模拟值的目的。例如,可以在测试中改变configManager模块的name属性值来模拟不同的情况。

在上面的示例中,configManager.js模块导出的是一个对象,其中包含一个name属性。code.js模块使用了configManager模块的name属性值,并将其返回。code.test.js模块进行了测试,首先断言func()的返回值为'name: original',然后通过改变configManager模块的name属性值来模拟不同的情况,并再次调用func()进行断言,验证返回值是否符合预期。

需要注意的是,直接改变模块绑定对象本身是行不通的,但是可以改变其属性值。这样,任何使用该模块的代码都会自动获取到改变后的属性值。

0
0 Comments

有时候在进行单元测试时,我们需要对某些依赖进行模拟(mock),以便更好地控制测试的环境。然而,有时我们需要在测试过程中改变被模拟依赖的值,而这可能会带来一些困扰。在这种情况下,我们可以通过设置完整的对象,并在调用要测试的函数之前直接更改特定属性的值来解决这个问题。

下面是一个解决方案的示例代码:

let mockConfig = { person: { name: 'dude', origin: {country: 'France'} } };
jest.mock('../../../configManager', () => mockConfig);
mockConfig.person = {};
mockConfig.person.name = 'dudette';

在上面的示例中,我们首先创建了一个名为`mockConfig`的模拟对象,并将其作为依赖进行模拟。然后,我们通过直接设置`mockConfig.person`的值为空对象,并将`mockConfig.person.name`的值更改为"dudette"。这样,在调用要测试的函数时,它将使用我们修改后的值。

尽管这种解决方案可能不是完美的,但它可以帮助我们在测试过程中改变被模拟依赖的值,以满足我们的需求。

0