Как в шутку проверить, была ли вызвана имитация внутренней функции? - PullRequest
0 голосов
/ 29 мая 2020

вот мой тестируемый файл:

файл. js:

function handleRequest(grpcRequestObj, callback){

    if(grpcRequestObj.type === REAL_CLIENT_REQUEST){
        log.trace("Запрос от реального клиента", refId);
        module.exports.realClientRequestWay(grpcRequestObj, callback);
        return;
    }
}
function realClientRequestWay(grpcRequestObj, callback){
    //some logic
}

module.exports = {
    handleRequest,
    realClientRequestWay
}

тестовый файл :


    test("should call real clients way", ()=>{
        jest.mock("../lib/grpc/state");

        const state = require("../lib/grpc/state");
        state.ready = true;
        const constants = require("../lib/grpc/constants");
        const handleRequestModule = require("../lib/grpc/handleRequest");
        const { handleRequest } = jest.requireActual("../lib/grpc/handleRequest");

        handleRequestModule.realClientRequestWay = jest.fn();

        const grpcRequest = {
            type: constants.REAL_CLIENT_REQUEST,
            refId: "123"
        };
        const mockCb = jest.fn();
        handleRequest(grpcRequest, mockCb);
        expect(handleRequestModule.realClientRequestWay).toHaveBeenCalledTimes(1);
    });

Я издеваюсь над функцией realClientRequestWay как с шутливой фиктивной функцией, просто чтобы проверить, работает ли она, но она не вызывает, что я делаю не так?

1 Ответ

0 голосов
/ 29 мая 2020

Вы можете использовать jest.spyOn (object, methodName) и mockImplementation, чтобы перезаписать исходную функцию поддельной.

Например

file.js:

const log = { trace: console.log };
const REAL_CLIENT_REQUEST = 'REAL_CLIENT_REQUEST';

function handleRequest(grpcRequestObj, callback) {
  const refId = '1';
  if (grpcRequestObj.type === REAL_CLIENT_REQUEST) {
    log.trace('Запрос от реального клиента', refId);
    module.exports.realClientRequestWay(grpcRequestObj, callback);
    return;
  }
}
function realClientRequestWay(grpcRequestObj, callback) {
  //some logic
}

module.exports = {
  handleRequest,
  realClientRequestWay,
};

file.test.js:

const file = require('./file');

describe('62079376', () => {
  afterEach(() => {
    jest.restoreAllMocks();
  });
  it('should request', () => {
    jest.spyOn(file, 'realClientRequestWay').mockImplementationOnce();
    const mCallback = jest.fn();
    file.handleRequest({ type: 'REAL_CLIENT_REQUEST' }, mCallback);
    expect(file.realClientRequestWay).toBeCalledWith({ type: 'REAL_CLIENT_REQUEST' }, mCallback);
  });

  it('should do nothing if type not match', () => {
    jest.spyOn(file, 'realClientRequestWay').mockImplementationOnce();
    const mCallback = jest.fn();
    file.handleRequest({ type: '' }, mCallback);
    expect(file.realClientRequestWay).not.toBeCalled();
  });
});

Результаты модульного тестирования со 100% покрытием:

 PASS  stackoverflow/62079376/file.test.js (10.044s)
  62079376
    ✓ should request (16ms)
    ✓ should do nothing if type not match (1ms)

  console.log
    Запрос от реального клиента 1

      at Object.handleRequest (stackoverflow/62079376/file.js:7:9)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 file.js  |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        11.393s, estimated 12s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...