#javascript #testing #jestjs #tdd
#javascript #тестирование #jestjs #tdd
Вопрос:
У меня есть вопрос, связанный с способом тестирования созданного мной класса сервиса:
serverRequest.service.js
import { get } from 'axios';
exports const serverRequest = {
get: (url, params) => {
try {
return get(url, params)
} catch() {
return new Error('server error');
}
}
}
serverRequest.service.spec.js
import { get } from 'axios';
import { serverRequest } from './serverRequest.service';
jest.mock('axios', () => ({
get: jest.fn(),
}));
//This part I am not sure if it is needed
const spyServerRequestGet = jest.spyOn(serverRequest, 'get');
describe('server request get', async () => {
const data = { data: {} };
get.mockReturnValue(data)
const result = await serverRequest.get('http://server', null);
// I'm not sure if this asserts have sense in here
expect(spyServerRequestGet).toHaveBeenCalledWith('http://server', null)
expect(spyServerRequestGet).toHaveBeenCalledTimes(1);
// this should be OK
expect(get).toHaveBeenCalledWith('http://server', null)
expect(result).toEqual(data);
});
Мой вопрос касается этой части:
// I'm not sure if this asserts have sense in here
expect(spyServerRequestGet).toHaveBeenCalledWith('http://server', null)
expect(spyServerRequestGet).toHaveBeenCalledTimes(1);
Я слежу за методом, который я хочу протестировать, потому что я думаю, что способ использования метода — это материал для тестирования.
Что вы думаете об этом утверждении?
Можно ли использовать тот же метод, который я хочу протестировать?
Ответ №1:
Вам не нужно шпионить за методами, которые вы хотите протестировать. Потому что вы знаете, какой метод ( serverRequest.get
) тестируется в текущем тестовом примере.
Вы должны отслеживать объекты и их методы ( axios.get
), вызываемые методом, который вы хотите протестировать. Затем вы можете создавать утверждения для них, чтобы проверить, вызываются ли они или нет, чтобы убедиться, что логика вашего кода и выполняемая ветвь кода соответствуют ожиданиям.
Например.
serverRequest.service.js
:
import { get } from 'axios';
export const serverRequest = {
get: (url, params) => {
try {
return get(url, params);
} catch (err) {
return new Error('server error');
}
},
};
serverRequest.service.spec.js
import { get } from 'axios';
import { serverRequest } from './serverRequest.service';
jest.mock('axios', () => ({
get: jest.fn(),
}));
describe('server request get', () => {
afterAll(() => {
jest.resetAllMocks();
});
it('should pass', async () => {
const data = { data: {} };
get.mockResolvedValue(data);
const result = await serverRequest.get('http://server', null);
expect(get).toHaveBeenCalledWith('http://server', null);
expect(result).toEqual(data);
});
});
результат модульного теста:
PASS src/stackoverflow/64069204/serverRequest.service.spec.js
server request get
✓ should pass (5ms)
--------------------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
--------------------------|----------|----------|----------|----------|-------------------|
All files | 80 | 100 | 100 | 80 | |
serverRequest.service.js | 80 | 100 | 100 | 80 | 8 |
--------------------------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 5.035s, estimated 9s