0

我正在尝试在一个非常简单的 CRUD Rails 3.2.8 应用程序中学习 Rspec。我遵循迈克尔·哈特尔(Michael Hartl)示例的一般模式,并且在外用黄瓜方面取得了一定的成功。现在我想测试 Twilio SMS 功能,但似乎无法进入第一垒,主要是因为我没有问正确的问题,所以我希望在这里得到纠正并回到正轨。我的应用程序有两个模型,商品和价格,它们在我的黄瓜测试中相互交互,所以它出现了。我知道,就像在黄瓜中一样,我需要一个对象来开始测试它的交互。在我的价格控制器中,我看到我可以在我的价格#create 方法中使用以下内容获取商品的价格:

 @price = @commodity.prices.build(params[:price])

我最终想创建一个工厂,对给定的商品有很多价格。但我想先到基地。按照他们自述文件中的thinkbot示例,我正在rails控制台中尝试以下操作:

 FactoryGirl.create(:commodity) do |price|
   Commodity.prices.build(attributes_for(:price))
 end

结果是: NoMethodError: undefined method `prices' for # 嗯,我一定不理解 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 上找到答案

4

1 回答 1

1

在你FactoryGirl.create有几个问题。首先, block 参数应该是commodity,而不是pricecreate将创建的对象传递到块中。其次,你正试图pricesCommodity课堂上奔跑。在您的对象关系中,prices是与特定实例关联的访问器。没有Commodity#prices方法,但任何给定的实例Commodity都会有prices. 您可能可以build这样使用,但我认为规范的方法是使用 shift 运算符添加一个Price.

把它放在一起可以让你:

FactoryGirl.create(:commodity) do |commodity|
  commodity.prices << FactoryGirl.create(:price, commodity: commodity)
end

我不确定您sequence在商品工厂定义中的用途。如果您试图确保默认情况下使用价格创建商品(而不像上面那样添加它们),请查看http://icelab.com.au/articles/factorygirl-and-has-many上的一些提示-协会/

于 2012-12-05T14:59:36.127 回答