2014-02-05 131 views
0

我是Rspec的新手,我正在爲舊項目進行測試。我遇到了設置變量的問題。基本上,我的用戶對象受到之前測試中的操作的影響。 我有一個簡單的用戶工廠:由於之前的測試,Rspec單元測試失敗

FactoryGirl.define do 
    factory :user do 
     first_name 'Bob' 
     last_name 'Shabbadoo' 
     office 
     login 'lurker48' 
     email '[email protected]' 
     password 'TestWhatNots#21' 
     password_confirmation{|u| u.password} 
    end 
end 

然後,我有我的實際測試的RSpec。

require "spec_helper" 

describe User do 

    it 'has a valid factory' do 
     FactoryGirl.build(:user).should be_valid 
    end 

    describe '#password' do 

    it "cannot contain the word 'password'" do 
     valid_user = FactoryGirl.build(:user) 
     valid_user.password << "password" 
     valid_user.password_confirmation = valid_user.password 
     valid_user.should_not be_valid 
    end 

    it "cannot contain the users last_name" do 
     valid_user = FactoryGirl.build(:user) 
     valid_user.password << valid_user.last_name 
     valid_user.password_confirmation = valid_user.password 
     valid_user.should_not be_valid 
    end 

    it "cannot contain the users first_name" do 
     valid_user = FactoryGirl.build(:user) 
     valid_user.password << valid_user.first_name 
     valid_user.password_confirmation = valid_user.password 
     valid_user.should be_valid 
    end 
    end 

end 

我故意做出的「不能包含用戶FIRST_NAME」測試失敗 和我的預期,我得到這個:

User 
    has a valid factory 
    #password 
    cannot contain the word 'password' 
    cannot contain the users last_name 
    cannot contain the users first_name (FAILED - 1) 

但是,當我花了仔細端詳了它看起來像這樣的密碼:

TestWhatNots#21passwordShabbadooBob 

爲什麼以前的測試中的操作會污染信息?

回答

0

當你建立新的用戶對象時,工廠女孩分配給它的密碼給定的字符串(這是String類的實例)。每次你這樣做,你的用戶密碼都指向那個對象 - 如果你建立了兩個用戶,他們的密碼不僅是相同的 - 它們是同一個對象。

通過使用<<方法你改變這個對象,因此你正在改變這個工廠已經或將要創建的所有對象的密碼值。

u1 = FactoryGirl.build(:user) 
u2 = FactoryGirl.build(:user) 

u1.password.object_id == u2.password.object_id #=> true! 

解決方案:

選項1.不要修改對象,而是分配一個新的字符串對象,而不是:

valid_user.password += valid_user.first_name 

選塊內2.用你所有的值。這將迫使FactoryGirl運行每個你建立新的對象,從而創建獨立但相同的字符串實例時阻止:據

factory :user do 
    first_name { 'Bob' } 
    last_name { 'Shabbadoo' } 
    ... 
+0

我記得註明HAS_ONE協會名稱爲這個對象調用的工廠,所以這兩個對象應該是不同。 – BroiSatse

+0

是的,你是對的。我不應該擔心這種關聯,因爲我不會像我那樣操縱信息。我使用+ =語法,因爲這隻會在需要時創建一個新字符串。 – BrandonRachal