私がモデルにメソッドを持っていた:モデルのコールバックメソッドを個別にテストする方法は?
class Article < ActiveRecord::Base
def do_something
end
end
私もこの方法のためのユニットテストを持っていた:私はそれがafter_save
コールバックには、このメソッドを移動する方が良いでしょう見つけるまで
# 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
すべてが大丈夫でした:
class Article < ActiveRecord::Base
after_save :do_something
def do_something
end
end
この方法に関する私のテストはすべて壊れました。私はでそれを修正する必要があります:create
やsave
は同様に、このメソッドをトリガーするためdo_something
に
- これ以上の具体的な呼び出し、または私は重複デシベルアクションを満たしています。代わりに、個々のメソッド呼び出し
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
のbuild
create
一般model.save
渡されたテストが、私の懸念は、それが具体的な方法についてはもはやいません。さらにが追加された場合は、が他のコールバックと混同されます。 私の質問は、モデルのインスタンスメソッドをテストするための美しい方法がありますか独立してはコールバックになりますか?
あなたの独創的なアプローチは、まだテストのために動作しない理由は明らかではありません。メソッドを直接テストし、それがコールバックとして個別に呼び出されることをテストします。私は何かを逃しているのですか、あなたはそのアプローチについて好きではない何かがありますか? –
@AndrewHubbs、ご質問ありがとうございます。理由は、このメソッドがdbを変更したためです。たとえば、この記事はカテゴリ「Rails」に割り当てられます。コールバックにリファクタリングした後、FactoryGirl.createを呼び出すと、このコールバックが有効になり、記事がカテゴリ「Rails」に割り当てられます。テスト中にこのメソッドを再度呼び出すと、既に割り当てられているためエラーが発生します。 –