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)
Другие вопросы по тегам