Как избежать временной связи с шуткой? - PullRequest
1 голос
/ 23 января 2020

Рассмотрим следующий пример:

// saveThings.js
import * as services from './services';

export default (a, b) => {
  return {
    aSaved: services.save(a),
    bSaved: services.save(b)
  };
};

И тест:

// test.js
import * as services from './services';
import saveThings from './saveThings';

jest.mock('./services');

test('saves things', () => {
  services.save.mockReturnValueOnce(true)
  services.save.mockReturnValueOnce(false)
  const result = saveThings(1, 2)
  expect(result).toEqual({aSaved: true, bSaved: false})
  expect(services.save).toHaveBeenCalledWith(1)
  expect(services.save).toHaveBeenCalledWith(2)
});

Это выполняет работу, проверяет ожидаемое значение и правильность вызовов службы.

Однако, он страдает от недостатка трагического c. Я случайно ввел временную зависимость между кодом и тестом. Тест требует, чтобы вызов кода сохранялся на a и b в определенном порядке. Однако, как видите, это не важно. Если порядок изменяется, функция по-прежнему работает, как и ожидалось, но тест завершается.

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

Есть ли способ справиться с этим с Jest? С помощью sinon вы можете указать аргументы при определении ожиданий. Есть ли способ сделать что-то подобное в Jest?

1 Ответ

0 голосов
/ 27 января 2020

Я нашел ответ. jest-when был создан для этого. API выглядит так:

when(services.save).calledWith(a).mockReturnValueOnce(true)
when(services.save).calledWith(b).mockReturnValueOnce(false)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...