我有一个叫做列表和产品的课程:
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方法 ...我怎么能让它传递但仍然可以进行良好的测试?
答案 0 :(得分:2)
在Listing
模型中,只有在调用@item
方法时才会定义实例变量item
,这在测试中不会发生。因此,当调用url
方法时,@item
为零,@item.pid
因undefined 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"