首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用jest侦察/模拟最小匹配

如何使用jest侦察/模拟最小匹配
EN

Stack Overflow用户
提问于 2020-02-22 16:51:25
回答 1查看 38关注 0票数 0

我知道如何使用mock/spy an ES6 import with jest,但这一点让我摸不着头脑:

my-module.ts

代码语言:javascript
复制
import minimatch from 'minimatch';

export function foo(pattern: string, str: string): boolean {
  return minimatch(pattern, str);
}

test.ts

代码语言:javascript
复制
describe('minimatch', () => {
  it('should call minimatch', () => {
    const mock = jest.fn().mockReturnValue(true);
    jest.mock('minimatch', mock);

    foo('*', 'hello');

    expect(mock).toHaveBeenCalled();
  });
});

我也尝试过用不同的方式模仿:

代码语言:javascript
复制
import * as minimatch from 'minimatch';
// ...
const mock = jest.fn().mockReturnValue(true);
(minimatch as any).default = mock;

甚至是

代码语言:javascript
复制
import {mockModule} from '../../../../../../test/ts/utils/jest-utils';
// ...
const mock = jest.fn().mockReturnValue(true);
const originalModule = jest.requireActual('minimatch');
jest.mock('minimatch', () => Object.assign({}, originalModule, mockModule));

我的测试使用上面所有的模拟方法都失败了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-24 15:45:16

您不能在测试用例功能范围内使用jest.mock()。您应该在模块范围内使用它。

例如,my-module.ts

代码语言:javascript
复制
import minimatch from 'minimatch';

export function foo(pattern: string, str: string): boolean {
  return minimatch(pattern, str);
}

my-module.test.ts

代码语言:javascript
复制
import { foo } from './my-module';
import minimatch from 'minimatch';

jest.mock('minimatch', () => jest.fn());

describe('minimatch', () => {
  it('should call minimatch', () => {
    foo('*', 'hello');
    expect(minimatch).toHaveBeenCalled();
  });
});

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

代码语言:javascript
复制
 PASS  stackoverflow/60350522/my-module.test.ts
  minimatch
    ✓ should call minimatch (6ms)

--------------|---------|----------|---------|---------|-------------------
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:        4.304s, estimated 6s

如果你想模拟测试用例中的模块,你应该使用jest.doMock(moduleName, factory, options)

例如。

my-module.test.ts

代码语言:javascript
复制
describe('minimatch', () => {
  it('should call minimatch', () => {
    jest.doMock('minimatch', () => jest.fn());
    const { foo } = require('./my-module');
    const minimatch = require('minimatch');
    foo('*', 'hello');
    expect(minimatch).toHaveBeenCalled();
  });
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60350522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档