2017-03-21 2 views
1

は、だから私はIDを受け入れる機能を作成したデータベースを照会する方法は、内部的に異なるシナリオに応じて、返された変異は、データに対して行われたデータからリポジトリを介してデータベースに照会し、我々は、データを返します。ユニットテスト

この機能をユニットテストするにはどうすればよいですか? リポジトリレイヤでfindメソッドをスタブしてデータを返すので、データベースに接続することに依存しませんか?

答えて

2

私はあなたがユニットテスト可能であるだけでユニットテストコードはできると主張します。ユニットテスト可能なコードの私の定義はこれらの性質を示すコードです:

  1. それは、そのすべての作業が戻り値(または例外をスロー)を通して表現されるその入力
  2. から、それは必要なすべてを取得し
  3. それは生成されません。任意の副作用

あなたが記述するコードは#1に違反し、データベースにアクセスしてください。

は、データベース呼び出しをあざけるだろうし、そのモックは、あなたがそれを変異させると期待される出力と比較することができるように、あなたの関数が期待データを提供する、直接あなたの質問に答えます。

しかし、私は本当の正解が単一責任の原則を適用し、あなたのコードをリファクタリングすることだと思います。テスト対象のコードは、ただ1つのことをするのではなく、2つのことを行い(データベースに行き、結果を変更する)

私は、データベース部分を抜け出すと、他の誰かの仕事としてそれを割り当てます。テスト対象のコードはそのデータベースの結果を入力として受け取り、その唯一の仕事はそのデータを変更して結果を返すことです。 、私見、それユニットがテスト可能になるだろう

。単体テストをするときには、dbをモックする必要はありません。単に、変更したいデータを書き込んで関数に渡すだけです。

+0

本当にありがとうございました! –

+0

引数をチェックし、データベースを照会し、データを使って何かを行うapiエンドポイントの場合、それらのコードを独自の単位にリファクタリングしますか? –

+1

@JakeLacey、はい。あなたが何を記述しているのか分かっていれば、私は関数を書いて、GetData()と呼ぶことにしましょう。それは約束を返すことができ、データが戻ってきたときにそれを達成することができます。成功した場合、MutateData()はそのデータを操作します。この例では、MutateData()は興味深いものであり、おそらく最もテストが必要なものです。データベースを嘲笑してGetData()をテストすることができますが、GetData()が約束を正しく使用していることは本当に何をテストしていますか?ボイラープレートのようなコードをテストするためのリターンは減少しています。助けてくれることを望む。 – zim