如何在玩笑中监视相同的模块功能?

Gar*_*ava 8 javascript reactjs jestjs react-native

我正在为一个函数编写单元测试,该函数调用同一模块内的另一个函数。

例如。

export function add(a, b) {
  return a + b
}

export function showMessage(a, b) {
  let sum = add(a, b)
  return `The sum is ${sum}`
}
Run Code Online (Sandbox Code Playgroud)

测试:

import * as Logics from './logics;

describe('showMessage', () => {
  it('should return message with sum', () => {
      let addSpy = jest.spyOn(Logics, 'add')
      let  showMessageResponse = Logics.showMessage(2, 2)
      expect(addSpy).toHaveBeenCalledTimes(1)
  });
});
Run Code Online (Sandbox Code Playgroud)

我想测试执行 showMessage 时是否调用了 add 函数。上面的一个给出了以下错误:

预计来电次数:1 已接来电次数:0

我找到了一个解决方案,但这需要更改函数的导出方式:

function add(a, b) {
  return a + b
}

function showMessage(a, b) {
  const sum = Logics.add(a, b)
  return `The sum is ${sum}`
}

const Logics = {
  showMessage,
  add
}
export default Logics
Run Code Online (Sandbox Code Playgroud)

我不想改变导出函数的方式。

Shu*_*rma 2

理想情况下,您应该独立测试功能。一项测试不负责另一项功能测试的功能。

这不是最好的方法,但你可以这样做:

util.js

export function add(a, b) {
  return a + b;
}

export function showMessage(a, b, addNew = add) {
  let sum = addNew(a, b);
  return `The sum is ${sum}`;
}

Run Code Online (Sandbox Code Playgroud)

在你的测试中你可以这样做: util.test.js

import * as Logics from "./util";

describe("showMessage", () => {
  it("should return message with sum", () => {
    let addSpy = jest.spyOn(Logics, "add");
    addSpy.mockReturnValue(123);
    let showMessageResponse = Logics.showMessage(2, 2, addSpy);
    expect(addSpy).toHaveBeenCalledTimes(1);
    expect(showMessageResponse).toBe(`The sum is 123`);
  });
});


Run Code Online (Sandbox Code Playgroud)

这是您可以使用的沙箱:https://codesandbox.io/s/jest-test-forked-9zk1s4 ?file=/util.test.js:0-366