что assert делает в службе класса в шутку

#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