首页 > 解决方案 > 如何为自定义库开玩笑

问题描述

abc.js

import { form } from '@myCustomLib/validator'
const _validator = new form.particulars.Validator()

function sampleFunctionIWantToTest(formInfo) {
   var error = _validator.fullValidation(formInfo)

   if(error) {return true}

   return false
}

我想为这个函数写一个测试。我想模拟 _validator.fullValidation(formInfo) 的结果

我该如何嘲讽?

标签: javascriptunit-testingmockingjestjs

解决方案


您可以使用jest.mock(moduleName, factory, options)来模拟@myCustomLib/validator包。

例如

abc.js

import { form } from '@myCustomLib/validator';
const _validator = new form.particulars.Validator();

function sampleFunctionIWantToTest(formInfo) {
  var error = _validator.fullValidation(formInfo);

  if (error) {
    return true;
  }

  return false;
}

export { sampleFunctionIWantToTest };

abc.test.js

import { form } from '@myCustomLib/validator';

const validatorMock = {
  fullValidation: jest.fn(),
};

jest.mock(
  '@myCustomLib/validator',
  () => {
    const formMock = {
      particulars: {
        Validator: jest.fn(() => validatorMock),
      },
    };
    return { form: formMock };
  },
  { virtual: true },
);

describe('62949328', () => {
  afterAll(() => {
    jest.resetAllMocks();
  });
  it('should return true', () => {
    const mError = new Error('error message');
    validatorMock.fullValidation.mockReturnValueOnce(mError);
    const { sampleFunctionIWantToTest } = require('./abc');
    const actual = sampleFunctionIWantToTest();
    expect(actual).toBeTruthy();
    expect(form.particulars.Validator).toBeCalledTimes(1);
  });

  it('should return false', () => {
    validatorMock.fullValidation.mockReturnValueOnce(null);
    const { sampleFunctionIWantToTest } = require('./abc');
    const actual = sampleFunctionIWantToTest();
    expect(actual).toBeFalsy();
    expect(form.particulars.Validator).toBeCalledTimes(1);
  });
});

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

 PASS  stackoverflow/62949328/abc.test.js (13.298s)
  62949328
    ✓ should return true (6ms)
    ✓ should return false (1ms)

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

jestjs版本:"jest": "^25.5.4",


推荐阅读