我正在尝试在一个非常简单的CRUD Rails 3.2.8应用程序中学习Rspec。我正在遵循迈克尔·哈特尔(Michael Hartl)的例子的一般模式,并且已经适当地用黄瓜为外部成功。现在我想测试一个Twilio短信功能,似乎无法进入一垒,主要是因为我没有问正确的问题,所以我希望在这里得到纠正并重新回到正轨。 我的应用程序有两种型号,商品和价格,它们在我的黄瓜测试中相互交互,所以它出现了。我知道,就像黄瓜一样,我需要一个物体来开始测试它的相互作用。在我的价格控制器中,我看到我可以通过以下价格获得商品的价格#create方法:
@price = @commodity.prices.build(params[:price])
我最终希望生成一个工厂,这个工厂的特定商品价格会很高。但我想先到基地。以下思路机器人的自述文件示例我在rails控制台中尝试以下内容:
FactoryGirl.create(:commodity) do |price|
Commodity.prices.build(attributes_for(:price))
end
结果是:NoMethodError:未定义的方法`价格'为# 嗯,我不能理解Rspec或Factory Girl。这是我的基本工厂.rb:
FactoryGirl.define do
factory :commodity do
name "corn"
end
sequence :price do |n|
price
date { Time.now }
end
end
以下是我的两个模型:
class Commodity < ActiveRecord::Base
attr_accessible :description, :name
has_many :prices
end
MOST_RECENT = 5
class Price < ActiveRecord::Base
attr_accessible :buyer, :date, :price, :quality, :commodity_id
scope :most_recent, lambda { order("id desc").limit(MOST_RECENT) }
belongs_to :commodity
end
我尝试理解这一点只是在Rails控制台中完成,但是当我运行rspec时也会出现错误。但是为什么FactoryGirl或者Rspec似乎没有使用我用Active Record获得的价格方法?很明显,我不理解某些东西,或者我会在Stack上找到答案,thanx,sam
答案 0 :(得分:1)
在FactoryGirl.create
中有一些问题。首先,块参数应为commodity
,而不是price
。 create
将创建的对象传递到块中。其次,您正尝试在prices
课程上运行Commodity
。在对象关系中,prices
是与特定实例关联的访问者。没有Commodity#prices
方法,但Commodity
的任何给定实例都有prices
。你可以这样使用build
,但我认为规范的方法是使用移位运算符来添加Price
。
把它放在一起可以得到你:
FactoryGirl.create(:commodity) do |commodity|
commodity.prices << FactoryGirl.create(:price, commodity: commodity)
end
我不确定您在商品工厂定义中使用sequence
做了什么。如果您尝试确保默认情况下使用价格创建商品(不添加上述商品),请查看http://icelab.com.au/articles/factorygirl-and-has-many-associations/上的一些提示。