Рассмотрим следующий пример:
// 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?