2011-08-15 58 views
0

我有以下工廠:RSpec的出廠女孩

Factory.define :producer, :class => User do |f| 
    f.sequence(:email) { |n| "producer_#{n}@shit.com" } 
    f.password "foobar" 
    f.password_confirmation "foobar" 
    f.role  "producer" 
end 

Factory.define :business do |f| 
    f.sequence(:name) { |n| "business_#{n}" } 
    f.association(:producer, :factory => :producer) 
end 

Factory.define :deal do |d| 
    d.sequence(:title) { |n| "deal_#{n}" } 
    d.sequence(:desc) { |n| "deal_desc_#{n}" } 
    d.cap "50" 
    d.rate "2" 
    d.start Date.today - 1  # This is the date where you put in db 
    d.end Date.today + 7 
    d.association :business 
end 
現在

,當我做到以下幾點:

before(:each) do 
    @consumer = test_sign_in(Factory(:consumer)) 
    @deal = Factory(:deal) 
    end 

我得到一個錯誤:

Failure/Error: @deal = Factory(:deal) 
NoMethodError: 
    undefined method `producer=' for #<Business:0x007fb494290090> 
# ./deals_controller_spec.rb:15:in `block (4 levels) in <top (required)> 

(第15行指的是@deal = Factory(:deal)

有誰知道爲什麼?我對工廠女孩很新,我似乎無法找到解釋關聯和序列的文檔。

回答

1

這裏的問題顯然與創建您的producer關聯有關。

由於您使用的舊的DSL,我建議兩種解決方案:

Factory.define :business do |f| 
    f.sequence(:name) { |n| "business_#{n}" } 
    #try this: 
    f.association(:user, :factory => :producer) 
    #or this: 
    f.after_build { |biz| biz.user = Factory.build(:producer) } 
end 

採用after_buildafter_create確實是一個選擇的問題,這取決於你的測試目的。

Here is a link to the new dsl lookup

+0

感謝您的回答,但我仍然得到同樣的錯誤,儘管有所改變。你知道爲什麼嗎? (我更新了主要問題) – disappearedng

+0

mmmm,並且你嘗試了'after_build'方法嗎? – apneadiving

+0

是的,我也是。你知道什麼啓發了製片人=在工廠的任何地方? – disappearedng