2010-07-27 39 views
13

任何人都可以請解釋一下這個測試代碼的作用:瞭解一個assert_difference

assert_difference('Post.count') do 
    post :create, :post => { :title => 'Hi', :body => 'This is my first post.'} 
end 

和...

assert_difference 'ActionMailer::Base.deliveries.size', +1 do 
    post :invite_friend, :email => '[email protected]' 
end 

我無法理解它,即使我閱讀文檔。

謝謝!

回答

26

一個assert_difference驗證評估其第一個參數(一個可傳遞給eval的字符串)的結果在調用傳遞的塊後會發生一定的變化。上面的第一個例子可以被「展開」爲:

before = Post.count # technically, eval("Post.count") 
post :create, :post => { :title => 'Hi', :body => 'This is my first post.'} 
after = Post.count 
assert_equal after, before + 1 
+0

但爲什麼第二個例子有+1而第一個沒有第二個參數?有什麼不同? – 2010-07-27 22:53:03

+0

@fayer - 我相信默認值是'+ 1'。在第二個例子中,他們只是明確地陳述它。 – 2010-07-27 22:55:22

+0

是的,默認是1. – 2010-07-27 23:17:21

6

這只是檢查,以確保無論出於何種指定型增加了1對象的數量(這是一個簡單的方法來檢查,看看一個對象被添加到數據庫)

0

此方法用於驗證第一個參數和第二個參數之間存在數值差異。在大多數情況下,第一個參數是一個類似「Post.count」的字符串,第二個參數是一個塊。在rails中,這主要用於功能測試,以檢查一個對象是否可以保存在數據庫中。邏輯是,在新的對象被保存之前,該特定表中的記錄數量必須不同於對象保存後的記錄數量(從1到精確)。