1

私はかなり大きなRailsアプリをテストしようとしています.おそらくずっとやっていたはずですが、完全に快適ではありませんでした. 現在、ユーザーが正常に作成されるかどうかを確認する機能テストに取り組んでいます。基本的に、いくつかのことをテストしたいと思います。

  • ユーザーが保存されたかどうか (つまり、DB に新しいレコードがあるかどうか)
  • 彼の情報 (名前、電子メールなど) が正しいかどうか
  • いくつかのフィールドがデータベースに自動的に追加されたかどうか
  • メールが送信されたかどうか
  • 電子メールのテキストが適切かどうか (つまり、電子メール テンプレートのユーザー名とアクティベーション リンクを代用するかどうか)

私が理解しているように、単体テストはモデルをテストするように設計されており、機能テストはコントローラーをテストする必要があります。上記のテストのいくつかは、私が見ているように、単体テストである必要があります。具体的には、入力がデータベースフィールドに正しくマップされていることと、ユーザーモデルを使用した単体テストで before_create フィルターが機能することを確認できると思います。

他の人は機能テストを要求しているようです - 電子メールが送信されるかどうか (そしておそらくそのテキスト - おそらくそれは UserEmail テストに属しますが?) と新しいレコードがあるかどうか.

これがモック/スタブに関する質問です。ユーザー コントローラーの機能テストでは、user.save が適切なパラメーターで呼び出されることを確認する必要がありますか、それとも DB が新しいレコードを取得することをテストする必要がありますか? 前者はスタブを呼び出しているようで、Rails は十分にテストされているため、ユーザー モデルで .save が呼び出された場合にオブジェクトが正常に保存されると想定しています。しかし、後者 (たとえば assert_difference の呼び出し)はより完全に感じられます。どちらを選ぶ?

これがあまりにも複雑な質問である場合は申し訳ありません-大きなトピックであることは理解していますが、このような特定の(長い場合)例を理解することで、一般的なテストについて多くのことが明確になることを願っています.

ありがとう!

4

2 に答える 2

1

答えるのは簡単な質問ではありません。基本的に、Railsの世界には2つのキャンプがあります。あるキャンプでは、テストが速くなるので、モックを使用するように指示されます。もう1つのキャンプでは、データベーステーブルに適切な列があることをテストするため、より「忠実」になるため、データベースを使用してテストするように指示されます。これは、モックでは実行されません。両方のキャンプは、彼らのテストのスタイルがより明確であることをあなたに教えてくれます:-)

私のアドバイスは、しばらくの間一方の方法を試し、次にもう一方の方法を試すことです。何があなたのために働くかを見てください。何よりも、テストが明確で表現力豊かであることを確認してください。グレッグ・ポラックによるこのプレゼンテーションで、レールのテストを開始する方法に関するヒントを見つけることができます。

于 2010-07-31T13:04:15.920 に答える
1

私が機能テストを行うのに好きな方法は、何もモック/スタブしないことです。基本的に、スタブ/モッキングは、クラスまたは機能のユニットを分離できるため、単体テストに非常に役立ちます。統合と機能テストに関して言えば、目的は「実際の」クラスの相互作用をテストすることなので、モック/スタブを避けたいと思うでしょう。

したがって、あなたの場合、ユーザーコントローラーの機能レベルのテストを行うときに DB を使用します。永続化レイヤーをスタブ化することにした場合は、コントローラーの単体テストを行っていると主張します (他に依存関係がないことを前提としています)。このようなテストでは、永続化レイヤーの問題 (DB の互換性のない変更など) を検出できません。スキーマ、DB 接続の問題など)。

要するに、どちらの方法も有効ですが、適切な方法は目的 (つまり、機能テスト、統合テスト、または単体テスト) によって異なります。

于 2010-09-22T14:59:09.267 に答える