Как издеваться и избегать вызовов экспресс-валидатора в шутку?

#node.js #mocking #jestjs #express-validator #ts-jest

#node.js #издевательство #jestjs #экспресс-валидатор #ts-jest

Вопрос:

В нашей кодовой базе есть код, подобный приведенному ниже:

 @Validate(Param1)
async post(request, responseHandler) {
 // some code
}
  

Я пытаюсь протестировать функцию post. Но хотите избежать оценки @Validate функции. Validate Это функция в другом модуле.

 // validator.ts
export const Validate = () => {
  // some code
}
  

Как? .

Ответ №1:

Вы могли бы использовать jest.mock(moduleName, factory, options) для создания поддельного Validate декоратора вместо использования реального Validate декоратора, у которого может быть много правил проверки.

Например.

index.ts :

 import { Validate } from './validator';

export class Controller {
  @Validate('params')
  async post(request, responseHandler) {
    console.log('real post implementation');
  }
}
  

validator.ts :

 export const Validate = (params) => {
  return (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) => {
    const oFunc = descriptor.value;
    descriptor.value = function inner(...args: any[]) {
      console.log('real validator decorator implementation');
      // lots of validation
      const rval = oFunc.apply(this, args);
      return rval;
    };
  };
};
  

index.test.ts :

 import { Validate } from './validator';
import { mocked } from 'ts-jest/utils';

jest.mock('./validator');

describe('63531414', () => {
  afterAll(() => {
    jest.resetAllMocks();
  });
  it('should pass', async () => {
    mocked(Validate).mockImplementationOnce((params) => {
      return (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) => {
        const oFunc = descriptor.value;
        descriptor.value = function inner(...args: any[]) {
          console.log('mocked validator decorator implementation');
          const rval = oFunc.apply(this, args);
          return rval;
        };
      };
    });
    const { Controller } = require('./');
    const logSpy = jest.spyOn(console, 'log');
    const ctrl = new Controller();
    await ctrl.post({}, () => {});
    expect(Validate).toBeCalledWith('params');
    expect(logSpy).toBeCalledWith('real post implementation');
  });
});
  

результат модульного теста с отчетом о покрытии:

  PASS  src/stackoverflow/63531414/index.test.ts (12.634s)
  63531414
    ✓ should pass (154ms)

  console.log node_modules/jest-mock/build/index.js:860
    mocked validator decorator implementation

  console.log node_modules/jest-mock/build/index.js:860
    real post implementation

--------------|----------|----------|----------|----------|-------------------|
File          |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
--------------|----------|----------|----------|----------|-------------------|
All files     |    45.45 |      100 |       25 |    45.45 |                   |
 index.ts     |      100 |      100 |      100 |      100 |                   |
 validator.ts |    14.29 |      100 |        0 |    14.29 |       2,3,4,5,7,8 |
--------------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        14.354s
  

исходный код: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/63531414