如何使用 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
,但失败消息的用处要小得多。
以下两个单独的测试正在处理各自的 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
,但失败消息的用处要小得多。