在 rails 模型中对总和进行单元测试

unit testing a sum in rails model

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

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

class Contest < ActiveRecord::Base
  has_many :submissions 

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

end

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

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)>'

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

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

您的测试显示

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

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

我的问题:sum 消息汇总是什么?它是一个名为 tonnage 的专栏吗?因为我在你的模型中看不到这一点。它是一个名为 tonnage 的列吗?你求和的逻辑不正确。