2012-08-25 17 views
15

使用rails,devise,rspec & factorygirl:我在哪裏確認用FactoryGirl創建的用戶?

試圖爲我的網站創建一些測試。我使用可確認的模型進行設計,因此當我使用FactoryGirl創建用戶時,用戶未被確認。

這是我factories.rb:

FactoryGirl.define do 
    factory :user do 
    full_name    "Aren Admin" 
    email     "[email protected]" 
    password    "arenaren" 
    password_confirmation "arenaren" 
    role_id    ADMIN 
    end 
end 

這是我的RSpec的測試文件:

require 'spec_helper' 

describe "Admin pages" do 

    subject { page } 

    describe "home page" do 
    let(:user) { FactoryGirl.create(:user) } 
    before { visit admin_home_path } 

    it { should have_content("#{ROLE_TYPES[user.role_id]}") } 
    end 
end 

我得到一個錯誤,因爲用戶沒有確認。通過搜索我很確定我需要使用方法'確認!'並且它屬於factories.rb文件,但我不確定它放在哪裏。

回答

9

before

發現here

+1

你的鏈接已經過期。哪個「之前」的塊呢?請給我們一個例子嗎? – Aleksandrus

23

嘗試user.confirm!更重要的是,請執行下列操作(那麼你並不需要過濾器之前創建一個爲每個測試套件)

Factory.define :confirmed_user, :parent => :user do |f| 
    f.after_create { |user| user.confirm! } 
end 

在這裏找到: https://stackoverflow.com/a/4770075/1153149

編輯添加的非過時的語法

FactoryGirl.define do |f| 
    #Other factory definitions 

    factory :confirmed_user, :parent => :user do 
    after_create { |user| user.confirm! } 
    end 
end 

編輯01/27要更新語法再次

FactoryGirl.define do 
    #Other factory definitions 

    factory :confirmed_user, :parent => :user do 
    after(:create) { |user| user.confirm! } 
    end 
end 
+1

嗨!我用過你的方法,它說>未定義的方法after_create。這是爲什麼? – oFca

+0

我需要更多的信息,它試圖在after_create上運行什麼對象?這可能是從舊的答案中拉出來的。我認爲Factory.define <您的工廠名稱>語法可能會被刪除。我將用最新的語法編輯我的答案。讓我知道如果這不起作用。 – Joeyjoejoejr

+0

這是一個很好的答案,我通常使用的是...除了ThoughtBot再次改變語法(我們在那裏嗎?)。它應該是'after(:create){... etc' – IAmNaN

30

你也可以設置confirmed_at屬性如下。工作對我來說:

FactoryGirl.define do 
    factory :user do 
    full_name    "Aren Admin" 
    email     "[email protected]" 
    password    "arenaren" 
    password_confirmation "arenaren" 
    role_id    ADMIN 
    confirmed_at   Time.now 
    end 
end 
+0

我一直比'confirm!'更喜歡這種方法,因爲它少了一個操作。 – IAmNaN

+0

用一個替換了兩條線......並且更直觀一點,imo。謝謝! – brntsllvn

+0

這是最乾淨的方式。感謝:+1: – moeabdol

1

添加此線內的工廠定義爲我工作

之前(:創建){|用戶| user.skip_confirmation! }

1

把設計確認的邏輯在後(:編譯)回調...

FactoryGirl.define do 
    factory :user do 
    after(:build) do |u| 
     u.confirm! 
     u.skip_confirmation_notification! 
    end 
... 
end 

對我來說,把確認!或skip_confirmation!在after(:create)塊導致電子郵件參數驗證錯誤,並且不起作用。

+0

只是'u.skip_confirmation!'構建後爲我工作。它也使用戶創建更快。 – Musaffa

1

您應該在create之前致電skip_confirmation!,以便用戶持久保存。

before(:create) do |user| 
    user.skip_confirmation! 
end 
1

這是工廠,工作對我來說

FactoryGirl.define do 
    factory :user do 
    sequence :email do |n| 
     "address#{n}@example.com" 
    end 
    sequence :password do |n| 
     "password#{n}" 
    end 

    factory :confirmed_user do 
     before(:create) {|user| user.skip_confirmation! } 
    end 
    end 
end 
相關問題