如何測試下面的例子?如何使用RSpec測試ActiveRecord回調?
class Post < ActiveRecord::Base
belongs_to :discussion, touch: true
end
如何測試下面的例子?如何使用RSpec測試ActiveRecord回調?
class Post < ActiveRecord::Base
belongs_to :discussion, touch: true
end
您可以設置一個message expectation:
it "should touch the discussion" do
post = Factory.build(:post)
post.discussion.should_receive(:touch)
post.save!
end
下面的例子使用Factory Girl,但你可以使用固定裝置或嘲笑爲好。
您可以模擬#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
如果你正在試圖做的是斷言,touch: true
選項設置上的關聯性,所有那麼你可以做到以下幾點:
describe Post do
it { should belong_to(:discussion).touch(true) }
end
對於一般測試回調,請繼續閱讀。
所有其他的答案在這裏有兩個缺陷:
他們需要的數據庫,這可能會很慢上一炮打響。
他們並不確定這回調期間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寫這個偉大的圖書館。
它總是令我感到驚訝Ruby/Rails/Rspec是多麼簡單優雅。 – 2010-04-21 08:08:33
這真的不是一個'好'的解決方案1)它很慢,因爲你正在觸及數據庫,2)你沒有測試觸摸是否是after_save回調的一部分,它可能會被任何一個驗證或作爲保存AR記錄的一部分發生的回調。 – Intentss 2014-08-20 21:28:30
@Intentss同意。什麼是更好的方法? – 2014-12-10 23:10:33