【问题标题】:unit testing a sum in rails model在 Rails 模型中对总和进行单元测试
【发布时间】:2015-09-29 20:06:20
【问题描述】:

我想创建一个测试来测试我的方法是否正常工作。

吨位在我的提交模型中计算并保存在那里。我的比赛视图中也需要该功能,这就是为什么我也将它包含在比赛模型中(这是正确的吗?)。

class Contest < ActiveRecord::Base
  has_many :submissions 

  def tonnage
    self.submissions.sum(:tonnage)
  end

end

当我测试(minitest)时出现以下错误:

FAIL["test_0003_must have tonnage", #<Class:0x007fbcb9fac260>, 2015-09-29 21:23:47 +0200]
 test_0003_must have tonnage#Contest (1443554627.17s)
        --- expected
        +++ actual
        @@ -1 +1 @@
        -440
        +#<BigDecimal:7fbcbc9ac150,'0.0',9(27)>
        test/models/contest_test.rb:17:in `block (2 levels) in <top (required)>'

我的测试看起来像这样(minitest):

describe Contest do
  let(:contest) { Contest.create(name: "test",
                                 admin_id: 1,) }

  it "must have tonnage" do
    contest.tonnage.must_equal 440
  end


end

测试输出是什么意思(失败),单元测试的正确方法是什么?我假设我的模型中的方法是正确的,因为它正在工作。

感谢下面的评论,我发现我指的是错误的比赛。下面是正确的测试:

describe Contest do

  let (:default) { contests :default }

  it "must have tonnage" do
    default.tonnage.must_equal 440
  end

end

【问题讨论】:

    标签: ruby-on-rails unit-testing ruby-on-rails-4 rspec minitest


    【解决方案1】:

    你的测试显示

        -440
        +#<BigDecimal:7fbcbc9ac150,'0.0',9(27)>
    

    意思是你期望440(正如你的测试断言)但是你得到了一个值为0.0的BigDecimal对象。可能是因为这是具有0.0 默认值的数据库列类型。

    我的问题:sum 消息总和是什么?它是一个名为 tonnage 的列吗?因为我在你的模型中看不到这一点。提交内容中是否有一个名为tonnage 的列?您求和的逻辑不正确。

    【讨论】:

    • 吨位在提交模型中计算,并保存在那里。这确实保存在提交的列吨位内。既然它对我来说是新的,我该如何最好地处理它?
    • 感谢您的帮助,我指的是错误的比赛,您让我看到了!
    猜你喜欢
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2017-08-11
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    相关资源
    最近更新 更多