我曾在一個模型的方法:如何獨立測試模型的回調方法?
class Article < ActiveRecord::Base
def do_something
end
end
我也有過這種方法的單元測試:
# spec/models/article_spec.rb
describe "#do_something" do
@article = FactoryGirl.create(:article)
it "should work as expected" do
@article.do_something
expect(@article).to have_something
end
# ...several other examples for different cases
end
一切都很好,直到我發現它是把這種方法進入一個after_save
回調:
class Article < ActiveRecord::Base
after_save :do_something
def do_something
end
end
現在我所有關於此方法的測試都被破壞了。我必須解決它:
- 沒有更具體的調用
do_something
因爲create
或save
將觸發此方法爲好,不然我會遇到重複的數據庫操作。 - 變化
create
到build
- 測試的respond_to
使用的一般
model.save
而不是單獨的方法調用model.do_something
describe "#do_something" do @article = FactoryGirl.build(:article) it "should work as expected" do expect{@article.save}.not_to raise_error expect(@article).to have_something expect(@article).to respond_to(:do_something) end end
測試通過,但我關心的是它不再是具體的方法。如果更多地添加,效果將是與其他回調混合。
我的問題是,是否有任何美麗的方式來測試模型的實例方法獨立成爲一個回調?
爲什麼你原來的做法不仍然可以用於測試目前尚不清楚。單元直接測試該方法,只是測試它被獨立地稱爲回調。我錯過了什麼,或者有什麼你不喜歡的方法嗎? –
@AndrewHubbs,謝謝你的提問。原因是這種方法改變了分貝。例如,它會將這篇文章分配給「Rails」類別。在refacoring回調後,當我調用FactoryGirl.create時,此回調將生效並將文章分配給類別「Rails」。當我在測試中再次調用此方法時,將會有一個錯誤,因爲它已被分配。 –