1

特に設計をテスト可能にする方法に関して、私が取り組んでいるアプリケーションの新しいモジュールに関するいくつかの設計アドバイスを探しています。

この問題は非常に一般的です。データベースからデータをロードし、そのデータに対していくつかの操作を実行して、結果をデータベースに保存します。アプリケーションの他のほとんどのモジュールには、次のパターンがあります。

private repo; //Set in constructor
public void Run() 
{
    Stuff stuff = repo.LoadStuff()
    Result result = RunOperationsInPrivateMethod(stuff); //private method
    repo.SaveResult(result);
}

したがって、これをテストするために、いくつかの選択肢があることがわかります。

  1. スタッフを返し、結果を確認するために使用できるモックリポジトリを挿入します。
  2. RunOperationsInPrivateMethodをリファクタリングしてアクセスを保護し、操作を直接テストします。

他のオプションがありませんか?人々の好みは何ですか?

4

1 に答える 1

4

一般に、プライベートメソッドをテストするのではなく、プライベートメソッドが本当に別のクラスのパブリックメソッドである必要があるかどうかを考えてください。つまり、オブジェクトを焦点を絞った機能を備えた小さなオブジェクトに分解します。

たとえば、実行する必要があります

private repo; //Set in constructor
private IOperation operation; // injected in constructor or through dependency injection.
public void Run() 
{
    Stuff stuff = repo.LoadStuff()
    Result result = operation.Run(stuff); //private instance with public method
    repo.SaveResult(result);
}

その場合、Runはオペレーションクラスのパブリックメソッドになります

class SecretOperation : IOperation
{
   public void Run(Stuff stuff) { /* secret stuff */ }
}

また、テストするためにデータベースからStuffをロードする必要はなく、SecretOperationのテストに焦点を合わせたフィクスチャでStuffを作成するだけです。これで、単体テストにさらに焦点を合わせることができます。

于 2012-11-23T08:50:48.967 に答える