2013-05-17 101 views
2

我正在嘗試爲我的Rails應用程序設置測試。我使用Factory Girl和Rspec與Sorcery進行身份驗證。出於某種原因,這個測試不及格:爲什麼FactoryGirl(:build)與Sorcery而不是FactoryGirl(:create)一起使用?

describe "User" do 
    it "has a valid the factory" do 
    user = FactoryGirl.create(:user) 
    user.should be_valid 
    end 
end 

但是這一個作用:

describe "User" do 
    it "has a valid the factory" do 
    user = FactoryGirl.build(:user) 
    user.should be_valid 
    end 
end 

對失敗的測試誤差表示,密碼不匹配的確認,所以它看起來像這樣與Sorcery如何處理密碼加密有關。

有沒有其他人遇到過這個問題?它是否與Sorcery加密密碼有關?是故意的還是錯誤的?

+0

看來我無法使用FactoryGirl.create創建用戶。我唯一能夠通過的是建立一個用戶,然後填寫註冊表單。這是巫術的限制嗎? –

+0

我認爲你只是有一個驗證問題。 '.create'正在調用save,而'.build'不是,後面的對象是有效的,因爲它還沒有通過驗證,因爲你沒有調用'#save'。 – shime

+0

我收到一個錯誤,說當我將測試切換到FactoryGirl.create時,密碼和password_confirmation不匹配。這是錯誤:https://gist.github.com/leemcalilly/d8607ad83d530558a011。那麼這與巫術如何醃製密碼有關嗎?因爲密碼和確認是一樣的。這是我的用戶工廠:https://gist.github.com/leemcalilly/ac401e08a45ebb7b884f。我也可以通過瀏覽器創建用戶。 –

回答

1

build是有效的,因爲構建的對象確實是一個有效的對象,儘管只存在於內存中。

create無效,因爲save失敗。

保存失敗的原因,我認爲應該是關於激活。我沒有巫術經驗,但只有設計,原則是相似的。看來Sorcery默認根據其自述文件要求激活。

通過在創建後添加激活鉤子,可以很容易地直接在工廠定義中修復它。

FactoryGirl.define do 
    factory :user do 
    # other fields 
    after(:create) { |user| user.activate! } 
    end 
end 
+0

這似乎是正確的方向。但我沒有啓用魔法激活模塊。我試過在(:create){| user | user.activate! }'以及'activation_state'active''給我的用戶工廠,但是我得到了一個沒有方法的錯誤。我認爲這是因爲激活模型未啓用。 –

+0

@LeeMcAlilly,他們應該是防止你保存的東西。您可以在控制檯中嘗試FactoryGirl.create(:user)並檢查響應。 –

+0

好FactoryGirl.create(:用戶)工作得很好:https://gist.github。com/leemcalilly/e0d6e34de8f24bba12cc –

0

好吧,你有用戶定義添加到FactoryGirl:

factory :user do 
    ... 
    password "foobar" 
    password_confirmation "foobar" 
end 

而且你的模型是這樣的:

class User < ActiveRecord::Base 
    authenticates_with_sorcery! 
    validates :password, confirmation: true 
    validates :password_confirmation, presence: true 
end 

,它肯定有效。

沒有激活或加密。