2013-01-21 73 views
0

我想重構一些RSpec/Rails測試,以便它們儘可能少地保留到數據庫的對象,但是在試圖弄清楚如何重新編譯時,寫測試,如下列:編寫Rails測試,不堅持如此多的數據庫對象

describe User do 
    context "record creation" do 
    before(:each) { @user = User.new(user_atts) } 

    it "should generate a confirmation_token" do 
     # Generated as the result of a callback 
     @user.save! 
     expect(@user.confirmation_token).to be_present 
    end 

    it "should set the confirmed_at attribute to nil" do 
     # Cleared as the result of a callback 
     @user.save! 
     expect(@user.confirmed_at).to be_nil 
    end 

    it "should call the send_confirmation_instructions method" do 
     @user.should_receive(:send_confirmation_instructions) {} 
     @user.save! 
    end 
    end 

    def user_atts 
    # return attributes hash 
    end 
end 

這是一個非常簡單的例子,但也有很多類似的例子在我的規格,並且,在大多數情況下,他們都堅持記錄到數據庫中。我很想利用RSpec的letsubject幫手,但我不確定那些人甚至會在這裏幫忙。

我一直在使用FactoryGirl了很多,認爲也許它build_stubbed戰略將加速我的規格一點,但我無法找到許多情況下,這將有助於限制實際記錄創建(或者也許我不知道如何使用)。

我假設有些情況下,測試需要記錄創建,但上面的例子幾乎看起來像其中之一。我應該甚至試圖重構這個還是有更好的寫這些測試?任何幫助將不勝感激。

回答

2

我的測試可能看起來像這樣。

describe User do 
    let(:user) { FactoryGirl.build_stubbed(:user) } 

    context "record creation" do 
    it "should generate a confirmation_token" do 
     user.save! 
     expect(user.confirmation_token).to be_present 
    end 

    it "should set the confirmed_at attribute to nil" do 
     user.save! 
     expect(user.confirmed_at).to be_nil 
    end 

    it "should call the send_confirmation_instructions method" do 
     expect(user).to receive(:send_confirmation_instructions).once 
     user.save! 
    end 
    end 
end 

這是使用Factory Girl來創建用戶模型。此外,我不得不DatabaseCleaner清除每次測試後的數據庫由@RahulGarg

註明外,你所要做的就是配置您的spec_helper像這樣

config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 

這意味着每次測試後數據庫將被清除。