开玩笑的模拟模块功能

时间:2021-03-10 16:32:00

标签: javascript typescript jestjs

我正在尝试对开玩笑的模拟函数进行断言,我的代码是这样的

const saveProductMock = jest.fn((product) => {
  //someLogic
  return
});

jest.mock('./db', () => {
  return {
    saveProduct: saveProductMock
  }
})

我的断言应该是这样的

expect(saveProductMock.mock.calls[0][0]).toBe(product)

但我收到以下错误:

<块引用>

ReferenceError:在初始化之前无法访问“saveProductMock”在行 saveProduct:saveProductMock

1 个答案:

答案 0 :(得分:0)

jest.mock()hoisted。结果,代码实际上是这样运行的:

jest.mock('./db', () => {
  return {
    saveProduct: saveProductMock
  }
})

const saveProductMock = jest.fn((product) => {
  //someLogic
  return
});

//WAS HERE

解决方案是将登录名放在 jest.mock(); 中。

jest.mock('./db', () => {
    return {
        saveProduct: jest.fn((product) => {
            //someLogic
            return
        })
    }
})

其他解决方案是简单地模拟整个模块,然后定义要使用的显式返回值。

const db = require('./db');
jest.mock('./db');

it("example", () => {
    db.saveProduct.mockReturnValue(123);
    /** different types of return methods */
    // db.saveProduct.mockResolvedValue(123);

    const product = db.saveProduct();
    const expectedProduct = "xyz";
    expect(product).toBe(expectedProduct)
})