在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

运行测试时出错 - jest.mock 不是函数

Jest mock 总是给出 undefined (typescript + ts-jest)

jest.mock():如何使用工厂参数模拟 ES6 类默认导入