как использовать Minitest для обработки ввода json для изменений записей

#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 приспособление…