你必须在Rspec Ruby中使用存根方法吗?

时间:2013-12-17 04:12:13

标签: ruby-on-rails ruby rspec

我有一个叫做列表和产品的课程:

class Listing
  belongs_to :product

  def item
    @item ||= Product.find(product_id)
  end

  def url
   "http://example.com/#{@item.pid}"
  end

end


class Product
  has_one :listing
  attr_accessor :pid #returns an integer
end

在我的spec文件中,我创建了一个带有工厂女孩的列表对象并为其分配了一个产品。我在以前的规格中测试过,每当我打电话时都会测试它:

@listing.item.id.should eq(@product.id)

它会通过。

但是,我试着打电话:

@product = FactoryGirl.create(:product)
@listing = FactoryGirl.create(:listing)

@product.listing = @listing
@listing.url.should eq("...")

并且它无法调用列表类中的url方法 ...我怎么能让它传递但仍然可以进行良好的测试?

2 个答案:

答案 0 :(得分:2)

Listing模型中,只有在调用@item方法时才会定义实例变量item,这在测试中不会发生。因此,当调用url方法时,@item为零,@item.pidundefined method error pid而导致nil }}

但是,您可以将@item.pid方法中的url引用更改为item.pid,这样就可以了,因为这会调用item方法

虽然这解释了您所得到的错误,但我无法真正建议您进行什么样的测试,因为您在应用程序中想要完成的工作并不清楚。

答案 1 :(得分:0)

我很困惑为什么在您已经设置item关联时创建了belongs_to方法。

class Listing
  belongs_to :product

  def url
   "http://example.com/#{product.pid}"
  end
end

class Product
  has_one :listing
  attr_accessible :pid
end

# test setup
# you can define the association in the factory
FactoryGirl.define do
  factory :listing do
    association :product
  end

  factory :product do
    pid 1234
  end
end

# test
listing = FactoryGirl.create(:listing)
listing.url.should eq "http://example.com/1234"