在 jest.mock 中开玩笑 'TypeError: is not a function'

新手上路,请多包涵

我正在编写 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 许可协议

阅读 1.2k
1 个回答

在我的例子中,我不得不模拟一个 Node.js 模块。我在 ES6 中使用 React 和 Redux ,使用 Jest 和 Enzyme 进行单元测试。

在我正在使用并为其编写测试的文件中,我默认导入节点模块:

 import nodeModulePackage from 'nodeModulePackage';

所以我需要将其模拟为默认值,因为我不断收到错误 (0, _blah.default) is not a function.

我的解决方案是:

 jest.mock('nodeModulePackage', () => jest.fn(() => {}));

在我的例子中,我只需要覆盖函数并让它返回一个空对象。

如果您需要在该节点模块上调用一个函数,您将执行以下操作:

 jest.mock('nodeModulePackage', () => ({ doSomething: jest.fn(() => 'foo') }));

原文由 jenkizenki 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题