RSpec 对特征类进行单元测试:未定义的方法

RSpec unit testing an eigenclass: undefined method

我正在尝试在 Product model.

中测试方法 cumulative_cost
#app/models/product.rb
class Product < ActiveRecord::Base
  class << self
    def cumulative_cost
      self.sum(:cost)
    end
  end
end

所以我会 运行 类似 Product.where(name:"surfboard").cumulative_cost 假设它 return 有两条记录,一条成本为 1000,另一条成本为 150,它将 return => 1150.

所以这是我写的测试。

RSpec.describe Product, "class << self#cumulative_cost" do
  it "should return the total cost of a collection of products"
    products = Product.create!([{name:"surfboard", cost:1000}, {name:"surfboard", cost:150}])
    expect(products.cumulative_cost).to eq(1150)
  end
end

然后当我 运行 我的测试失败了。

undefined method `cumulative_cost' for #<Array:0x007fe3e31844e8>

如有任何帮助,我们将不胜感激。

cumulative_costProduct 模型上的 class 方法。所以,你必须这样称呼它:Product.cumulative_cost.

错误是说:

undefined method `cumulative_cost' for #<Array:0x007fe3e31844e8>

这意味着,您正在数组上调用此 cumulative_cost 方法,但它未在数组对象上实现,因此会出现此错误。

将您的期望更改为:(根据 SteveTurczyn 的回答)

expect(Product.where(name:"surfboard").cumulative_cost).to eq(1150)

继 K M Rakbul Islam 的回答之后...

products 是一个数组,因为这是 Product.create! 提供的数组 returns。

你的测试应该是...

expect(Product.where(name:"surfboard").cumulative_cost).to eq(1150)