jest.mock 与命名导出如何监视

tmp*_*dev 8 mocking jestjs

假设我在文件中有以下命名导出 customer.ts

export const saveDetails = ()=>{}
export const loadDetails = ()=>{}
Run Code Online (Sandbox Code Playgroud)

假设我在另一个文件中使用它

import {saveDetails, loadDetails} from './customer.ts'
Run Code Online (Sandbox Code Playgroud)

我想用自定义实现来模拟'./customer.ts'。为此,我使用以下代码

const mockSaveDetails = jest.fn().mockImplementation(() => {});
jest.mock('./customer.ts', () => {
  return {
    saveDetails: mockSaveDetails
  };
});
Run Code Online (Sandbox Code Playgroud)

现在,当我运行此代码时,出现以下错误

ReferenceError:初始化前无法访问“mockSaveDetails”

根据https://jestjs.io/docs/en/es6-class-mocks上的文档,我知道模拟被提升到顶部,但如果变量具有前缀mock. 因此,根据文档,这应该可以正常工作吗?如果不是,提供模拟模拟实现并saveDetails使用某些参数监视这些实现(例如查看进行了多少次调用)的替代方法是什么。

sli*_*wp2 8

这是解决方案:

index.ts

import { saveDetails, loadDetails } from "./customer";

export function main() {
  saveDetails();
  loadDetails();
}
Run Code Online (Sandbox Code Playgroud)

customer.ts

export const saveDetails = () => {
  console.log("real save details");
};
export const loadDetails = () => {
  console.log("real load details");
};
Run Code Online (Sandbox Code Playgroud)

index.spec.ts

import { main } from "./";
import { saveDetails, loadDetails } from "./customer";

jest.mock("./customer.ts", () => {
  return {
    saveDetails: jest.fn(),
    loadDetails: jest.fn()
  };
});

describe("main", () => {
  it("should mock correctly", () => {
    main();
    expect(saveDetails).toBeCalledTimes(1);
    expect(loadDetails).toBeCalledTimes(1);
  });
});
Run Code Online (Sandbox Code Playgroud)

100% 覆盖率的单元测试结果:

PASS  src/stackoverflow/59024742/index.spec.ts
  main
    ? should mock correctly (5ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.ts |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        5.626s, estimated 9s
Run Code Online (Sandbox Code Playgroud)

源代码:https : //github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59024742