Укажите параметр функции в шутливом издевательстве

#javascript #typescript #unit-testing #testing #jestjs

Вопрос:

В настоящее время я пишу модульные тесты, чтобы улучшить свой охват, и я застрял на функции, в которой я хочу задать входной параметр функции.

Функция, которую я хочу протестировать, это:

 this.map.forEachFeatureAtPixel(e.pixel, (event: any) => {
    if (
      event.values_.name === 'name'
    ) {
      this.openWeatherData(event.values_.name);
    } //more logic ...
  });
 

Я хочу протестировать код внутри функции обратного вызова, чтобы проверить, сделаны ли правильные вызовы.

Но как мне установить параметр события на что-то вроде

 { values_ : { name: 'name' } }
 

и выполните фактическую реализацию обратного вызова, чтобы улучшить мой охват.

Ответ №1:

Используйте jest.spyOn(объект, имя метода) для создания макетной версии this.map.forEachFeatureAtPixel() метода и его издевательской реализации. Издевательская реализация принимает два параметра: pixel и callback . Вызовите callback функцию вручную с помощью объекта издевательского события.

Напр.

index.ts :

 export const obj = {
  map: {
    // simulate real implementation
    forEachFeatureAtPixel(pixel, callback) {
      callback();
    },
  },
  method(e) {
    this.map.forEachFeatureAtPixel(e.pixel, (event: any) => {
      if (event.values_.name === 'name') {
        console.log('openWeatherData');
      }
    });
  },
};
 

index.test.ts :

 import { obj } from './';

describe('67818053', () => {
  it('should pass', () => {
    const mEvent = { values_: { name: 'name' } };
    const forEachFeatureAtPixelSpy = jest
      .spyOn(obj.map, 'forEachFeatureAtPixel')
      .mockImplementationOnce((pixel, callback) => {
        callback(mEvent);
      });
    obj.method({ pixel: '12' });
    expect(forEachFeatureAtPixelSpy).toBeCalledWith('12', expect.any(Function));
    forEachFeatureAtPixelSpy.mockRestore();
  });
});
 

результат теста:

  PASS  examples/67818053/index.test.ts (8.297 s)
  67818053
    ✓ should pass (14 ms)

  console.log
    openWeatherData

      at examples/67818053/index.ts:11:17

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        9.055 s