如何使用 Minitest 处理记录更改的 json 输入

how to use Minitest to handle a json input for record changes

以下两个单独的测试正在处理各自的 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.

那么这个测试应该怎么施放呢?

通过反复试验

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 夹具...

您需要将条件包装在 lamdba 中:

article = articles(:fifty_five)
assert_changes ->{ article.sell_price }, from: 9.99, to: 0.01 do
  post array_api_v1_articles_path, params: @existing, as: :json
  article.reload
end

此 lambda 将在块 运行 之前和之后计算。

您正在做的是传递 Float 的实例(或者 Decimal,如果您做得对的话),它实际上并没有改变。数值实际上是不可变的。

虽然您可以使用 assert_equal,但失败消息的用处要小得多。