2012-02-17 61 views
0

我知道這是一個基本的問題,但有太多令人困惑,過時的&矛盾的信息在那裏......我設法爭奪我的大腦......如何最好地訪問父模型從一個孩子的控制器規格...使用FactoryGirl?RSpec:controller_specs資源與關係

它可能是部分與使用來自子模型的(to_params)中父模型(user.name)的值有關。這對我來說工作得很好。我只是有一個很難測試它:

少女模特兒:

User 
    :name - string - unique 
    :email - string - unique 
    has_many :ballots 

Ballot 
    belongs_to :user 
    has_many :items 

    def to_param # 
    "#{id} #{user.name}".parameterize 
    end 

factories.rb:

FactoryGirl.define do 
    sequence :email do |n| 
    "person#{n}@fake_mail.com" 
    end 

    sequence :name do |n| 
    "Person#{n}" 
    end 

    factory :user do 
    name "Joe Schmo" 
    email 
    end 

    factory :sequenced_user, :parent => :user do 
    name 
    email 
    end 

    factory :ballot do 
    sequenced_user 
    end 

ballots_controller_spec.rb:

describe BallotsController do 

    def valid_attributes 
    FactoryGirl.attributes_for(:ballot) 
    end 

    describe "GET show" do 
    it "assigns the requested ballot as @ballot" do 
     ballot = Ballot.create! valid_attributes 
     get :show, {:id => ballot.to_param}, valid_session 
     assigns(:ballot).should eq(ballot) 
    end 
    end 

    ... 

end 

規格故障:

1) BallotsController GET show assigns the requested ballot as @ballot 
    Failure/Error: get :show, {:id => ballot.to_param}, valid_session 
    NoMethodError: 
     undefined method `name' for nil:NilClass 
    # ./app/models/ballot.rb:5:in `to_param' 
    # ./spec/controllers/ballots_controller_spec.rb:53:in `block (3 levels) in <top (required)>' 

    ... 

問題似乎是運行規範無法訪問投票所關聯的用戶的name。但是,投票工廠裏有一個關聯的用戶!?!那麼,使用FactoryGirl產生這種關係的正確方法是什麼?

+0

可以爲您發佈一行:'./app/models/ballot.rb: 5'和周圍的環境? (功能'#to_param') – farnoy 2012-02-17 21:33:09

+0

它在那裏。基本上'Ballot'類包含'belongs_to:user'和'to_param'(你可以在上面看到)。 – Meltemi 2012-02-18 00:13:47

回答

0

你可以嘗試:

factory :ballot do 
    association :user, :factory => :sequenced_user 
end 

好像FactoryGirl試圖讓ballot.sequenced_user,當你只想ballot.user