2013-06-02 50 views
1

我有這些模型:如何獲取創建的FactoryGirl對象?

class User < ActiveRecord::Base 
    has_many :company_users, :dependent => :delete_all 

class Company < ActiveRecord::Base 
    has_many :company_users, :dependent => :delete_all 
    has_many :users, :through => :company_users 

class CompanyUser < ActiveRecord::Base 
    belongs_to :company 
    belongs_to :user 

我用這個輔助函數來創建並登錄:

def create_company_admin 
    company_user = FactoryGirl.create(:company_user, :has_shopper, :has_company, :admin) 
    user = User.first 
    login_as user, scope: :user 
    company_user 
end 

這是實際測試

feature 'user listing' do 
    background do 
    company_user = create_company_admin 
    end 
    scenario 'getting user list' do 
    visit '/companies' 
    page.has_content? company_user.user.name 
    end 
end 

這工作,直到他所稱的地方:似乎不存在的company_user.user.name。在那裏,我得到了一個未定義的局部變量或方法`company_user」

這是工廠:

factory :company_user, class: CompanyUser do 
    authorized true 

    trait :admin do 
    admin true 
    end 

    trait :not_admin do 
    admin false 
    end 

    trait :has_shopper do 
    association :user, factory: :shopper 
    end 

    trait :has_company do 
    association :company, factory: :company 
    end 
end 

編輯:

這是購物者的工廠(這是一種用戶)

factory :shopper, class: User do 
    username "user" 
    email "[email protected]" 
    password "password1" 
    after(:create) do |u| 
    u.skip_confirmation! 
    u.save! 
    end 
end 

如何獲得測試中的用戶,公司和company_user?

回答

1

在你的幫手中,你創建了company_user。但company_user屬於user,我沒有看到你創建一個用戶(創建company_user後,你可以調用user = User.first,但那將是nil)。

我也沒有看到你創建一家公司。首先使用工廠創建用戶,然後使用公司,然後使用company_user(引用用戶)。

然後,您可以訪問它們在測試中與user = User.firstcompany = Company.firstcompany_user = CompanyUser.first

+0

但用戶似乎創建因爲當我跟隨在Firefox我看到在用戶和公司記錄的,兩者都顯示並鏈接到用戶,以便這是正確的。我編輯的問題也包括購物者工廠(實際上是一個用戶)。我試圖在助手中創建用戶,但後來我收到一條錯誤消息,指出郵件地址已被使用(這也證實了我認爲用戶已經使用company_user創建的想法)。 – rept

+0

當我添加:用戶= User.first和公司= Company.first它的情況下工作。這是一個好習慣嗎?如果我有多個用戶或公司,該怎麼辦? – rept

+0

我會說好的做法是僅創建您需要的模擬對象,以便很容易參考。如果您只創建了一個,那麼您可以使用'Model.first',否則當您創建對象並將其與測試中的對象一起引用時,它會將電子郵件地址(用戶的情況下)傳遞到工廠。好的,所以你的用戶是在購物工廠中創建的,所以你不需要事先創建它(我假定你的公司工廠的工作原理相同) – andreofthecape

相關問題