2017-03-12 12 views
0

親がコールバックを子オブジェクトにテストする方法があるかどうかは、親が破棄をトリガーするときに呼び出されます(before/after_destroydependent: :destroy?明らかに、破壊プロセスで作成されたオブジェクトにアクセスすることはできません。親が破棄されたときにコールバックを呼び出すかどうか(:destroy:に依存)

私はMiniTestとMocha gemを使用しています。私はそれが関係を嘲笑したり、また方法を嘲笑することと関係があるかもしれないと思う?

答えて

1

私たちは、どの程度厳格な分離を望んでいるかによって異なります。

我々はRailsの4でこの例を持っているとしましょう:

class Post < ActiveRecord::Base 
    has_many :comments, dependent: :destroy 

    after_destroy :after_destroy_method 

    def after_destroy_method 
    end 
end 

class Comment < ActiveRecord::Base 
    belongs_to :post 
end 

知っているポストのモデルの責任ではありませんので、私はコメントは破壊されます後にどうするか、とにかくいくつかのアイソレーションを使用することをお勧めします。コールバックの正しい動作をテストするには、Commentモデルテストを実行する必要があります。

厳格な分離:

我々は、我々は関係にdependent: :destroyを適用するならば、Railsはそのジョブを実行し、(それがテストされ、魅力のように働いている)のコールバックを呼び出します知っています。したがって、テストするもの:

  • 適切な場所にdependent: :destroyを使用します。このために、私たちはこのようにPostモデルのテストでShoulda Matchersを使用することができます。should have_many(:comments).dependent(:destroy)

それほど厳格な分離を:

それはPostモデルのテストでは、統合テストに近づいている:

test "calls #after_destroy_method on the comments after a post gets destroyed" do 
    post = Post.create title: "Test title" 
    Comment.create post: post 

    Comment.any_instance.expects(:after_destroy_method) 

    post.destroy 
end 
+0

ああ! '.any_instance'は私がそれを知らずに探していたものです:)それは間違いなく私が必要とした解決策です。これはまっすぐなRailsプロジェクトではなく、宝石のためのものなので、追加のコールバックが起動するか起動しないかをテストすることが重要です。 –

0

before/after_destroyブロック内の変換が完了したかどうかをテストする必要があります。

DBを更新しましたか?嘲笑されたオブジェクトが呼び出されましたか?

+0

問題は、私がテストしているコールバックは、破壊される前に兄弟レコードのDB更新を行います。兄弟姉妹も破壊されると(従属::破壊によって)、アップデートが発生したかどうかのトレースは残っていません。 –

+0

問題のPRはここにあります:https://github.com/swanandp/acts_as_list/pull/261ここでは、すべての兄弟姉妹がとにかく破壊されることを知っているときに、余分な更新を防ぎたいと考えています。 –

関連する問題