2011-03-21 56 views
5

所以我有這樣的事情在Rails中使用RSpec:如何在rspec中的lambda後測試多個事物?

it "should create a new user" do 
    lambda do 
    post :create, @attr 
    end.should change(User,:count) 
end 

但職位:創建,@attr都將創建用戶和公司,讓我怎麼「鏈」的變化來電,我可以測試兩個? 我在找什麼就像end.should change(User,:count) && change(Company,:count)

回答

8

我認爲你試圖在單個測試中斷言很多,它不符合測試的名稱。想想這個:

it "should create a new user" do 
    lambda do 
    post :create, @attr 
    end.should change(User,:count) 
end 

it "should create a new company" do 
    lambda do 
    post :create, @attr 
    end.should change(Company,:count) 
end 

此外,您可能不知道,有寫這做同樣的事情這些斷言的更好的方式,但讀得多好聽:

expect { 
    post :create, @attr 
}.to change(Company, :count) 
+0

噢,好方法寫它,gratz。經過進一步測試和睡覺之後,我傾向於同意你的觀點。 – Houen 2011-03-23 22:19:32

0

@idlefingers - 重:

「我要說你要斷言得多在一個單一的測試,它 不匹配測試的名稱」

  • 雖然有時候,我不希望另一個單獨的例子只是爲了執行另一個斷言,出於性能方面的原因,並且保持測試套件時間不變。

要解決這個問題,你可以使用這一招:

def user_and_company_count 
    User.count + Company.count 
end 

it "can assert both counts" do 
    expect { post :create, @attr }.to change(self, :article_an_activity_count).by(2) 
end 
+0

嘿,thewoolleyman,謝謝你的回答。雖然我仍然認同我的測試做得太多,但我發現了一種很好的方式來一次測試一件以上的東西。請參閱「多個值」部分:http://blog.houen.net/rspec-expect-change-record-value/ – Houen 2014-09-08 13:15:11

1

爲幾年開發者成長後,我發現一個相當乾淨的解決方案,在需要的時候測試多個值:

expect{ execute }.to change{ [spe1.reload.trashed?, spe2.reload.trashed?] }.from([true, true]).to([false, false]) 

但是,當我們需要測試創建多個記錄:

[User, Company].each do |klass| 
    it "creates one #{klass}" do 
    expect{ post :create, valid_args }.to change(klass, :count).by(1) 
    end 
end 
+0

而上述內容應包含在與業務案例匹配的上下文中 – Houen 2015-07-24 07:06:18