首页 > 解决方案 > 当测试和测试对象在不同文件中时,从其他文件模拟导入的函数

问题描述

有没有可能以某种方式嘲笑这个myHelper()

|
 -- myService.js
 -- myService.spec.js
 -- myHelper.js

myService.js

import { myHelper } from './myHelper.js';

export class MyService {
  myMethod() {
    const myVar = myHelper(42); // I need to mock this
  }
}

myService.spec.js

import { MyService } from './myService';

describe('my test', () => {
  it('should work properly', () => {
    expect(myService.myMethod()).toBe(24);
  });
});

标签: javascriptunit-testingtestingjestjs

解决方案


您可以使用jest.mock(moduleName, factory, options)来模拟myHelper模块和myHelper功能。

例如 myService.js

import { myHelper } from './myHelper';

export class MyService {
  myMethod() {
    const myVar = myHelper(42);
    return myVar;
  }
}

myHelper.js

export function myHelper(n) {
  return n;
}

myService.test.js

import { MyService } from './myService';
import { myHelper } from './myHelper';

jest.mock('./myHelper', () => {
  return {
    myHelper: jest.fn(),
  };
});

describe('my test', () => {
  it('should work properly', () => {
    myHelper.mockReturnValueOnce(24);
    const myService = new MyService();
    expect(myService.myMethod()).toBe(24);
  });
});

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

 PASS  stackoverflow/61370607/myService.test.js (13.137s)
  my test
    ✓ should work properly (3ms)

--------------|---------|----------|---------|---------|-------------------
File          | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
--------------|---------|----------|---------|---------|-------------------
All files     |     100 |      100 |     100 |     100 |                   
 myService.js |     100 |      100 |     100 |     100 |                   
--------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        15.028s

源代码:https ://github.com/mrdulin/react-apollo-graphql-starter-kit/tree/master/stackoverflow/61370607


推荐阅读