如何使用Jest模拟第三方软件包?

时间:2018-06-07 16:47:35

标签: javascript reactjs mocking jestjs enzyme

我希望能够测试是否调用此Swal()函数。

它被嘲笑但我不熟悉Jest模拟库。

这是我的测试设置文件:

jest.mock('sweetalert2', () => {
  return {
    Swal: () => {},
  };
});

所以我只想让它返回一个函数。

在我的组件中,Swal被称为:

doSomething = () => {
  Swal({
    title: 'Could not log in',
    text: error.message,
    type: 'error',
  });
};

我认为我的模拟需要返回一个命名方法,所以我可以监视它并检查它是否被调用。

我的测试:

import Swal from 'sweetalert2';

describe('Login Container', () => {
  it('calls Swal', () => {
    doSomething();
    var swalSpy = jest.spyOn(Swal, 'Swal');
    expect(swalSpy).toHaveBeenCalled();
  });
});

错误:

expect(jest.fn()).tohavebeencalled();

如果测试失败,我应该如何设置我的模拟和间谍

2 个答案:

答案 0 :(得分:0)

您可以在jest.fn模拟中返回模拟函数sweetalert.js

module.exports = jest.fn();

并按照以下方式编写测试:

import { doSomething } from './doSomething';
import Swal from 'sweetalert';

describe('Login Container', () => {
  it('calls Swal', () => {
    expect(Swal).toHaveBeenCalledTimes(0);
    doSomething();
    expect(Swal).toHaveBeenCalledTimes(1);
  });
});

请注意,我在示例代码中使用sweetalert而不是sweetalert2

希望这有帮助!

答案 1 :(得分:0)

我希望模拟工厂需要使用default返回一个对象(因为import Swal正在导入默认模块)。像这样(降低wealalert v1):

// extract mocked function
const mockAlert = jest.fn()

// export mocked function as default module
jest.mock('sweetalert', () => ({
  default: mockAlert,
}))

// import the module that you are testing AFTER mocking
import doSomethingThatAlerts from './doSomethingThatAlerts'

// test suite loosely copied from OP
describe('Login Container', () => {
  it('calls Swal', () => {
    doSomethingThatAlerts();

    // test mocked function here
    expect(mockAlert).toHaveBeenCalled();
  });
});