2010-04-20 116 views

回答

15

您可以設置一個message expectation

it "should touch the discussion" do 
    post = Factory.build(:post) 
    post.discussion.should_receive(:touch) 
    post.save! 
end 

下面的例子使用Factory Girl,但你可以使用固定裝置或嘲笑爲好。

+0

它總是令我感到驚訝Ruby/Rails/Rspec是多麼簡單優雅。 – 2010-04-21 08:08:33

+2

這真的不是一個'好'的解決方案1)它很慢,因爲你正在觸及數據庫,2)你沒有測試觸摸是否是after_save回調的一部分,它可能會被任何一個驗證或作爲保存AR記錄的一部分發生的回調。 – Intentss 2014-08-20 21:28:30

+0

@Intentss同意。什麼是更好的方法? – 2014-12-10 23:10:33

1

您可以模擬#touch調用,或者驗證回調對其的影響。

it "should touch the discussion" do 
    original_updated_at = @discussion.updated_at 
    @post.save! 
    @post.discussion.updated_at.should_not_be == original_updated_at 
end 
9

首先

如果你正在試圖做的是斷言,touch: true選項設置上的關聯性,所有那麼你可以做到以下幾點:

describe Post do 
    it { should belong_to(:discussion).touch(true) } 
end 

其次

對於一般測試回調,請繼續閱讀。

所有其他的答案在這裏有兩個缺陷:

  1. 他們需要的數據庫,這可能會很慢上一炮打響。

  2. 他們並不確定回調期間save!

而是調用,使用Shoulda Callback Matchers,這並不需要一個數據庫打擊,您可以指定哪些回調你測試的存在。

安裝

安裝Shoulda Callback Matchers與捆紮機:

group :test do 
    gem "shoulda-callback-matchers", "~> 1.0" 
end 

使用

it { should callback(:some_method).after(:save) } 

謝謝Beat寫這個偉大的圖書館。