#ruby-on-rails #minitest
Вопрос:
Следующие два отдельных теста обрабатывают соответствующую строку json
assert_no_difference('Article.count') do post array_api_v1_articles_path, params: @existing, as: :json end { "items": { [ { code: "00083", "sell_price": 0.01 }, ... ] } } assert_changes articles(:fifty_five).sell_price, from: 9.99, to: 0.01 do post array_api_v1_articles_path, params: @existing, as: :json end { "items": { [ { code: "00084", "sell_price": 0.01 }, ... ] } }
В то время как первый случай может измерить изменение count
, второй — при возврате нового значения с puts
помощью команд в методе отражает изменение
puts @article.sell_price 0.01
, утверждение терпит неудачу: 0.999e1 didn't change. Expected 9.99 to not be equal to 9.99.
Как же тогда следует проводить это испытание?
Комментарии:
1. Попробуйте округлить числа, которые вы сравниваете, это может быть какая-то десятичная разница, которая не полностью печатается Minitest. Просто, если вы можете это сделать, если округление или приведение невозможно, попробуйте использовать
==
.2. Попробуйте сделать
assert_changes articles(:fifty_five).reload.sell_price, ...
, возможно, экземпляр находится в памяти, и запрос post изменяет базу данных, но вы не перечитываете базу данных для нового значения3. да, я тоже пробовал это,
0.999e1 didn't change. Expected 9.99 to not be equal to 9.99.
но перезарядка была недостающим ингредиентом. Опубликовал решение.
Ответ №1:
Вам нужно завернуть условие в lamdba:
article = articles(:fifty_five) assert_changes -gt;{ article.sell_price }, from: 9.99, to: 0.01 do post array_api_v1_articles_path, params: @existing, as: :json article.reload end
Эта лямбда будет оценена до и после запуска блока.
То, что вы делаете, — это передача экземпляра с плавающей запятой (или десятичной, если вы все делаете правильно), который на самом деле не меняется. Цифры на самом деле неизменны.
Хотя вы можете использовать assert_equal
сообщение об ошибке, оно гораздо менее полезно.
Ответ №2:
Методом проб и ошибок
assert_changes articles(:fifty_five).reload.sell_price [...] do assert_changes articles(:fifty_five).sell_price [...] do
блоки никогда не работали. Похоже, проблема в блоке. Питье
post array_api_v1_articles_path, params: @params, as: :json assert_equal 0.01, articles(:fifty_five).reload.sell_price
генерирует утверждение с успехом. reload
приспособление…