typescript 如何在Jest中正确模拟simple-git库

tp5buhyn  于 2023-05-08  发布在  TypeScript
关注(0)|答案(1)|浏览(120)

我正在尝试为使用simple-git库的NestJS应用程序编写Jest测试。我想模拟simpleGit()的返回值,这样我就可以在不实际运行Git命令的情况下测试模块的行为。
下面是我的模块中的相关代码:

import simpleGit from 'simple-git';

function myFunction() {
  const git = simpleGit();
  git.checkout('my-branch');
}

下面是Jest测试规范文件

import myFunction from './my-module';
import simpleGit, { SimpleGit } from 'simple-git';

jest.mock('simple-git', () => {
  const mGit = {
    init: jest.fn(),
    checkout: jest.fn(),
    addConfig: jest.fn(),
    fetch: jest.fn(),
    pull: jest.fn(),
    checkIsRepo: jest.fn(),
  };
  const mSimpleGit = jest.fn(() => mGit);
  return {
    default: mSimpleGit,
    SimpleGit: mSimpleGit,
  };
});

describe('myFunction', () => {
  it('should call checkout with the correct branch', () => {
    myFunction();
    expect(simpleGit().checkout).toHaveBeenCalledWith('my-branch');
  });
});

这实际上从简单的git而不是我的Mock调用了实际的checkout函数,但我不确定我做错了什么。如何在Jest测试中正确模拟simple-git库?
预期的行为应该是测试应该调用模拟的checkout函数。

mum43rcc

mum43rcc1#

我们可以使用jest.mock(moduleName,factory,options)和Jest的自动锁定特性来创建模拟对象,而不是指定显式的模块工厂。
例如:
my-module.ts

import simpleGit from 'simple-git';

export default function myFunction() {
  const git = simpleGit();
  git.checkout('my-branch');
}

my-module.test.ts

import simpleGit from 'simple-git';
import myFunction from './my-module';

jest.mock('simple-git');

const simpleGitMock = simpleGit as jest.Mock

describe('myFunction', () => {
  it('should call checkout with the correct branch', () => {
    const gitMock = {
      checkout: jest.fn(),
    }
    simpleGitMock.mockReturnValue(gitMock)
    myFunction();
    expect(gitMock.checkout).toHaveBeenCalledWith('my-branch');
  });
});

测试结果:

PASS  stackoverflow/76176798/my-module.test.ts (18.282 s)
  myFunction
    ✓ should call checkout with the correct branch (6 ms)

--------------|---------|----------|---------|---------|-------------------
File          | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
--------------|---------|----------|---------|---------|-------------------
All files     |     100 |      100 |     100 |     100 |                   
 my-module.ts |     100 |      100 |     100 |     100 |                   
--------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        21.418 s
Ran all test suites related to changed files.

软件包版本:

"simple-git": "^3.18.0",
"jest": "^26.6.3",

相关问题