Minitest assert_equal не работает, когда должно быть равно
У меня есть минимальный тест, который утверждает, совпадает ли десятичное число. Интересно, почему это
Мой код утверждения:
assert_equal -9.04, elts[2].change.round(2)
Отказ:
Ошибка: LeaveTypePolicyTest#test_case_12 [/usr/src/app/test/models/leave_type_policy_test.rb:1007] Minitest::Assertion: Ожидается: -9.04 Фактическое: -0.904e1
Кто-нибудь испытал это? и, возможно, почему это не удается? У меня есть много тестов, делающих подобные утверждения, но только это по какой-то причине не работает.
1 ответ
Использовать assert_in_delta
, например:
assert_in_delta -9.04, elts[2].change, 0.01
СМОТРИ ТАКЖЕ: Test:: Unit:: Assertions #assert_in_delta: https://www.rubydoc.info/github/test-unit/test-unit/Test%2FUnit%2FAssertions:assert_in_delta
Например, это проходит:
assert_in_delta 0.33, 1.0/3, 0.01
Возможно, первоначальный сбой теста был вызван сравнением float
к BigDecimal
или что-то подобное. Видимо, Ruby нужно, чтобы классы в таком сравнении совпадали. Вот простой пример, который воспроизводит подобное поведение:
bar = -9.04 # Float
baz = BigDecimal.new("-0.904e1") # BigDecimal (not Float)
puts bar == baz # false
puts bar == baz.round(2) # false (even after rounding!)
puts bar == baz.to_f # true (converted to Float)
puts bar == baz.to_f.round(2) # true (same, plus rounded)