5

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

データ入力フィールドの 1 つでいくつかの検証を行っていないという生産上のバグを見つけました。

そこで、ValidateFoo() というスタブ関数を追加しました... この関数に対して単体テストを作成して、JobFailedException を期待し、テストを実行しました。その関数が空だったため、明らかに失敗しました。検証ロジックを追加したところ、テストに合格しました。

これで、検証が機能することがわかりました。問題は、ValidateFoo() が Job.Run() 内で実際に呼び出されることを確認するテストをどのように作成するかです。ValidateFoo() は Job クラスのプライベート メソッドであるため、インターフェイスではありません...

NMock2.0でこれを行う方法はありますか? TypeMock が非インターフェース型の偽物をサポートしていることは知っています。しかし、モック ライブラリを今すぐ変更することはできません。この時点で NMock がサポートできない場合は、単に ValidateFoo() 呼び出しを Run() メソッドに追加して手動でテストするだけです。現在、100% のカバレッジ。何かアドバイス?どうもありがとうございました。

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

EDIT2:これを行う方法はありますか?誰にもアイデアがありますか?多分 TypeMock - またはより良いデザインですか?

4

2 に答える 2

5

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
于 2010-04-26T17:13:43.517 に答える
1

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

テスト中のクラスが見えません。プライベート メソッドへのアクセスを必要とするもう 1 つの問題は、それが大量のプライベート機能を備えた非常に大きなクラスであることです。これらのクラスは、より小さなクラスに分割する必要がある場合があり、それらのプライベートのいくつかは、より単純なパブリックに変わる場合があります。

于 2011-03-23T22:48:45.860 に答える