#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