在jest.mock中Jest'TypeError:不是函数'
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在jest.mock中Jest'TypeError:不是函数'相关的知识,希望对你有一定的参考价值。
我正在写一个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 is not a function
如果我改为写:
...
methodOne: jest.fn(() => 2)
然后测试通过没问题。
有没有办法在模拟本身之外定义它?
谢谢!
我想通了。这与吊装有关,请参阅:Jest mocking reference error
它之前在我做过的测试中工作的原因是因为我是testSubject本身就是一个类。这意味着当testSubject被实例化时,它是在测试文件中的变量声明之后,因此模拟有权使用它。
因此,在上述情况下,它永远不会起作用。
就我而言,我不得不模拟一个节点模块。我在ES6中使用React和Redux,使用Jest和Enzyme进行单元测试。
在我正在使用的文件中,并为其编写测试,我将导入节点模块作为默认值:
import nodeModulePackate from 'nodeModulePackage';
因此我需要将其模拟为默认值,因为我不断收到错误(0, _blah.default) is not a function.
。我的解决方案是:
jest.mock('nodeModulePackage', () => jest.fn(() => {}));
在我的情况下,我只需要覆盖该函数并使其返回一个空对象。
如果需要在该节点模块上调用函数,则执行以下操作:
jest.mock('nodeModulePackage', () => ({ doSomething: jest.fn(() => return 'foo') }));
希望这有助于某人:)
以上是关于在jest.mock中Jest'TypeError:不是函数'的主要内容,如果未能解决你的问题,请参考以下文章
jest中的mock,jest.fn()jest.spyOn()jest.mock()
jest中的mock,jest.fn()jest.spyOn()jest.mock()
jest.mock() 中的 jest.fn() 返回 undefined