質問

完全なコードカバレッジを備えたクラスAPIがあり、DIを使用して、すべての作業を行うメインクラス関数(job.run)のすべてのロジックをモックアウトします。

生産でバグを見つけました。そこでは、データ入力フィールドの1つで検証を行う必要がありました。

そこで、validatefoo()というスタブ関数を追加しました...この関数に対するユニットテストを作成して、JobFailedExceptionを期待し、テストを実行しました - その機能が空であるために明らかに失敗しました。検証ロジックを追加しましたが、これでテストが渡されました。

素晴らしい、今私たちは検証が機能することを知っています。問題は - validatefoo()が実際にjob.run()と呼ばれることを確認するために、テストを作成するにはどうすればよいですか? validatefoo()はジョブクラスのプライベートな方法です。したがって、インターフェイスではありません...

とにかくnmock2.0でこれを行うことはありますか? Typemockが非インターフェイスタイプの偽物をサポートしていることを知っています。しかし、今のところモックLibsを変更することは選択肢ではありません。この時点で、nmockがサポートできない場合、validatefoo()call to the run()メソッドを手動でテストするだけです。現在100%のカバレッジ。何かアドバイス?どうもありがとうございました。

編集:私が念頭に置いているもう1つのオプションは、job.run機能の統合テストを作成することです(モックの代わりに複合オブジェクトの真の実装を注入)。そのフィールドに悪い入力値を与え、ジョブが失敗したことを検証します。これは私のテストを機能させ、カバーします - しかし、それは実際には単体テストではなく、1つの機能の単位をテストする統合テストです。

edit2:TIHSを行う方法はありますか?誰かがアイデアを持っていますか?たぶんTypeMock - またはより良いデザインですか?

役に立ちましたか?

解決

nmock2の現在のバージョン コンクリートタイプを模倣できます(これを追加したバージョンを正確に覚えていませんが、バージョン2.1を使用しています)。

Job job = mockery.NewMock<Job>(MockStyle.Transparent);
Stub.On(job).Method("ValidateFoo").Will(Return.Value(true));

mockstyle.transparentは、スタブや期待していないものはすべて、基礎となる実装によって処理されるべきであることを指定しているため、テストしているインスタンスでメソッドに対する期待を固定して設定できます。

ただし、パブリックメソッド(およびプロパティ)にのみスタブを設定して設定することができます。これは、仮想または抽象的でなければなりません。したがって、統合テストに依存することを避けるために、2つのオプションがあります。

  • 作る Job.ValidateFoo() パブリックと仮想。
  • 検証ロジックを新しいクラスに抽出し、インスタンスをに注入します Job.

他のヒント

すべてのプライベートはすべてパブリックメソッドで呼ばれているため(反射ランタイムの実行に依存しない限り)、それらのプライベートはパブリック方法によって実行されます。これらのプライベート方法は、クラスフィールドの設定や他のオブジェクトへの呼び出しなど、単にコードを実行するだけでなく、オブジェクトに変更を引き起こしています。プライベートメソッドを呼び出す「結果」を得る方法を見つけました。 (または、プライベートな方法で実行されるべきではないものをあざける。)

テスト中のクラスが見えません。プライベートな方法にアクセスしたいと思う可能性のあるもう1つの問題は、プライベート機能のボートを備えた非常に大きなクラスであることです。これらのクラスは小さなクラスに分解する必要があり、それらの民間人の一部はより単純な公共に変わるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top