我正在编写 Jest 模拟,但在模拟本身之外定义模拟函数时似乎遇到了问题。
我有一堂课:
myClass.js
class MyClass {
constructor(name) {
this.name = name;
}
methodOne(val) {
return val + 1;
}
methodTwo() {
return 2;
}
}
export default MyClass;
和一个使用它的文件:
testSubject.js
import MyClass from './myClass';
const classInstance = new MyClass('Fido');
const testSubject = () => classInstance.methodOne(1) + classInstance.name;
export default testSubject;
和测试:
testSubject.test.js
import testSubject from './testSubject';
const mockFunction = jest.fn(() => 2)
jest.mock('./myClass', () => () => ({
name: 'Name',
methodOne: mockFunction,
methodTwo: jest.fn(),
}))
describe('MyClass tests', () => {
it('test one', () => {
const result = testSubject()
expect(result).toEqual('2Name')
})
})
但是,我收到以下错误:
TypeError: classInstance.methodOne 不是函数
如果我改为写:
...
methodOne: jest.fn(() => 2)
然后测试通过没有问题。
有没有办法在模拟本身之外定义它?
原文由 glenrothes 发布,翻译遵循 CC BY-SA 4.0 许可协议
在我的例子中,我不得不模拟一个 Node.js 模块。我在 ES6 中使用 React 和 Redux ,使用 Jest 和 Enzyme 进行单元测试。
在我正在使用并为其编写测试的文件中,我默认导入节点模块:
所以我需要将其模拟为默认值,因为我不断收到错误
(0, _blah.default) is not a function.
。我的解决方案是:
在我的例子中,我只需要覆盖函数并让它返回一个空对象。
如果您需要在该节点模块上调用一个函数,您将执行以下操作: