在Jest单元测试中重置模拟模块的值

时间:2017-02-27 15:27:37

标签: reactjs redux jestjs

我正在尝试在测试单独模块时模拟导入模块中的方法。我能够使用ES2015导入语法成功模拟导入的模块,但模拟在整个测试中保持一致,并且有些实例我想要更改模拟。

我的文件看起来像这样

// ModuleA
import ModuleB from 'ModuleB'

// ... code

// TestCase
import ModuleA from 'ModuleA'
import ModuleB from 'ModuleB'

jest.mock('ModuleB', () => {
  return {
    value: true
  }
}

describe('ModuleA', () => {
  it('returns true', () => {
    // This test expects ModuleB.value to return true
  });

  it('returns false', () => {
    // This doesn't work
    ModuleB.value = jest.fn(() => false)
    // This doesn't work either
    jest.mock('ModuleB', () => {
      return {
        value: false
      }
    });
    // This test expects ModuleB.value to return false in order to pass
  });
});

我当然需要为ModuleB分开嘲笑。过去,我只能使用var ModuleB = require('ModuleB');代替import,然后在需要时调用ModuleB.someMethodName = jest.fn()。我想仅使用ES2015进行这些测试,并且使用我刚刚提到的模式给出了ModuleB is read-only错误。

1 个答案:

答案 0 :(得分:0)

使用requireActual方法:

  

为了确保手动模拟及其实际实现保持同步,在手动模拟中使用require.requireActual(moduleName)并在导出之前使用mock函数修改它可能是有用的。

例如:

  const RealModule = require.requireActual('Form');
  const MyModule = {
    RealThing: RealModule.RealThing,
    …add some mocks
  };

<强>参考