【问题标题】:Is there a way to change the mocked value of a required dependency?有没有办法改变所需依赖项的模拟值?
【发布时间】:2019-10-22 04:17:50
【问题描述】:

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

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

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

【问题讨论】:

标签: jestjs


【解决方案1】:

所以,我找到了一个我并不完全满意但可行的解决方案:

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

示例:

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


mockConfig.person = {};
mockConfig.person.name = 'dudette';

【讨论】:

    【解决方案2】:

    您根本不需要模拟模块。

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

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

    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!
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-18
      • 2020-05-01
      • 2020-06-28
      • 1970-01-01
      • 2011-09-21
      • 2020-02-10
      • 2016-07-31
      • 2016-01-05
      相关资源
      最近更新 更多