【问题标题】:how to use Minitest to handle a json input for record changes如何使用 Minitest 处理记录更改的 json 输入
【发布时间】:2021-11-27 18:56:19
【问题描述】:

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

那么这个测试应该如何进行呢?

【问题讨论】:

  • 尝试对您要比较的数字进行四舍五入,它可能会出现一些小数差异,Minitest 没有完全打印出来。只要你可以这样做,如果舍入或强制转换是不可能的,那么请尝试使用==
  • 尝试做assert_changes articles(:fifty_five).reload.sell_price, ...,可能实例在内存中并且发布请求正在更改数据库但您没有重新读取数据库以获取新值
  • 是的,我也试过了,得到0.999e1 didn't change. Expected 9.99 to not be equal to 9.99. 但重新加载是缺少的成分。发布了解决方案。

标签: ruby-on-rails minitest


【解决方案1】:

您需要将条件包装在 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,但失败消息的用处要小得多。

【讨论】:

    【解决方案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夹具...

    【讨论】:

      猜你喜欢
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多