Rspec,FactoryGirl无法找到ActiveRecord方法

时间:2012-12-05 14:28:53

标签: ruby-on-rails-3 rspec2 factory-bot

我正在尝试在一个非常简单的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

1 个答案:

答案 0 :(得分:1)

FactoryGirl.create中有一些问题。首先,块参数应为commodity,而不是pricecreate将创建的对象传递到块中。其次,您正尝试在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/上的一些提示。