3

インターフェイスから他のクラスでメソッドを実行することを唯一の目的とするクラスがあります。

クラスのインターフェースのテストは問題ありませんが、ランナーは実際には何もしません。(現状では)コンストラクターに渡される唯一のパラメーターはプライベートに保たれます。

私の場合、クラスはテキストファイルをデータベースにインポートしています。

internal DataImporter
{
  private List<IFileImporter> _importers;

  public DataImporter(List<IFileImporter> importers){
    _importers = importers;

  public bool RunImporters()
  {
    //foreach importer, call its "Run" method - each one then does whatever it needs to do
    //however, this need not call a specific "Run" method on IFileImporter
    //I have another app that uses IFileImporter to check for presence of a file first
    //then allow user to choose to import or not.
  }

ここでテストするものは何もないように私には思えますか?の値をテストすることはできません。テストの_importersためだけに公開したくありません。DataImporterはこのインスタンスに固有であるため、インターフェースを作成してもメリットはないようです。

他の場所でIFileImportersを再利用しましたが、これが唯一の「バルク」インポーターであり、他のインポーターはwinformsアプリから手動で呼び出され、他のインポーターはこのプロジェクトにまったく含まれていません。

だから、これをテストする必要があります...これについて何をテストできますか?

4

3 に答える 3

2

メソッドが呼び出されたことを表明できます。これらの質問を参照して、それがどのように行われるかを確認できます。

DataImporterクラス内で例外が発生しなかったことを表明することもできます。

使用するインターフェイスを完全に制御できる場合は、特定の操作が成功したかどうかを示すインターフェイスをそれぞれに返すと便利な場合があります。boolean

于 2012-12-20T09:09:07.683 に答える
2

一言で言えば、はい。頭のてっぺんからいくつかのテストを考えることができます。

テストでは、コンストラクターで渡したIFileImportersをモックアウトすることにより、すべてのインポーターが呼び出されることを確認します。少なくとも、コンストラクターで渡したものが実際にメソッドによって使用されることを表明します。

例外を発生させるインポーターがあれば、クラスが期待どおりに動作することを確認するためのテスト。

リストが空の場合、テストは動作をアサートする必要があります。(デフォルトはTrueリターンですか?)

テストでは、1つ以上のインポーターが失敗した場合に期待する動作も表明する必要があります。(RunImportersの結果に対してインポーターの結果をand-ingまたはor-ingしていますか?)

メソッドは、前の失敗に関係なくすべてのインポーターを実行しますか、それとも最初の失敗でfalseを返しますか?

コンストラクターまたはアサーションでnullリストが提供されているかどうかのテストも行う必要があります。

于 2012-12-20T09:07:19.223 に答える
1

メソッドが返さboolれ、そこから開始します。次に例を示します。

  • 輸入業者がいない場合はどうなりますか?例:Run_ReturnsFalse_WhenThereIsNoImporters
  • それらの1つが壊れた(または投げた)とどうなりますか?例:Run_ReturnsFalse_WhenAtLeastOneImporterFails
  • 成功を示しているのは何ですか(戻るtrueと思います)?例:Run_ReturnsTrue_WhenAllImportersSucceed

これらの各シナリオをシミュレートし、それを再度テストするようにモックを設定します。観察可能な影響(戻り値など)が実際にない場合は、モックされたオブジェクトに対して呼び出しが行われたことを確認することによってそれを行います。

于 2012-12-20T09:12:36.933 に答える