-1

getInfogetColor在同一个文件中调用。我的意图是模拟getColor函数,我将 func.js 作为模块和 spyOn 导入getColor。mockedgetColor应该返回“Red”,但它仍然调用实际函数并返回“Black”。

函数文件

// func.js
function getColor() {
    return "black"
}

function getInfo(){
    const color = getColor()
    const size = "L"
    return `${color}-${size}`
}

module.exports = { getColor, getInfo }

测试文件

// func.test.js
const func = require("./func")

describe("Coverage Change Test", () => {
  beforeAll(() => {
    const colorMock = jest.spyOn(func, "getColor"); // spy on otherFn
    colorMock.mockImplementation(() => "Red");
  });

  afterAll(() => {
    colorMock.resetAllMocks();
  })

  test("return Large Red", async () => {
    const res = func.getInfo();
    expect(res).toEqual("Red-L");
  });
});

我也试过requireActual,但它也叫实际的。

const { getInfo, getColor } = require('./func');

jest.mock('./func', () => ({
  ...jest.requireActual('./func.'),
  getColor: jest.fn().mockImplementation(() => 'Red'),
}))

describe('test', () => {
  test('returns red', () => {
    const res = getInfo()
    expect(res).toEqual("Red-L")
  })
})

如何在 Jest 中正确模拟嵌套函数?提前致谢。

4

2 回答 2

0

您正在监视func.getColor并模拟其实现,但getInfo正在调用本地范围的getColor函数。你必须改变getColor被调用的方式才能模拟它。

exports.getColor = function() {
  return 'black'
}

exports.getInfo = function() {
  const color = exports.getColor()
  const size = 'L'
  return `${color}-${size}`
}
于 2021-02-21T05:30:32.867 回答
0

使用rewire模块重写导出的属性。

您的测试文件将如下所示:

const rewire = require('rewire')

describe('test', () => {
  let func;
  let getColorSpy;
  beforeEach(() => {
    getColorSpy = jest.fn()
    func = rewire(__dirname + '/func.js') // import
    func.__set__('getColor', getColorSpy) // rewrite content of getColor
  })
  test('should return Red-L when getColor returns Red', () => {
    getColorSpy.mockReturnValue('Red')

    const res = func.getInfo()

    expect(res).toEqual("Red-L")
  })
})

尽量避免编写像你的模块这样的代码。

于 2021-02-21T12:44:32.597 回答