RSpec: to be_within().of()
Как вы прекрасно знаете, в комплуктерах 0,1 + 0,2 ≠ 0,3
. Аналогичные проблемы есть и в любых других вычислениях, связанных с дробями (считай, с числами с плавающей запятой). Поэтому в тестах никогда нельзя напрямую сравнивать дробные результаты вычислений.
Используйте be_within(delta).of(expected)
— матчер, проверяющий, что полученное число находится в окрестности радиусом delta от нужного:
expect(score).to be_within(0.0001).of(2.19)
Аналогичная история и со временем: в Руби Time имеет точность до наносекунд, а БД — до микросекунд или секунд. В таких случаях приходится сравнивать приведением к юникстайму:
expect(deadline.to_i).to eq Time.new(2022, 7, 7).to_i
Или тем же матчером:
expect(deadline).to be_within(1.second).of(Time.new(2022, 7, 7))
И конечно, если работаете с деньгами, берите BigDecimal
.
P. S. Ещё больше постов о программировании, тестах и культуре разработки у меня в Телеграме.