1

MS Test をプライベート アクセサーと組み合わせて使用​​して、クラスの単体テストを行っています。プライベート アクセサー (VS 2012 では使用できません :-( ) をうまく利用して、プライベート メソッドを呼び出します。うまくいきます。

しかし、ネストされたプライベート クラスにアクセスできません。

例えば:

public class Tool
{
  private IList<Result> DoSomePreparation(object anything)
  {
    // do some preparations here
  }

  private class Result { }
}

プライベート アクセサーを使用して、自分のプライベート メソッドにアクセスできます

{
  var accessor = new Tool_Accessor(new PrivateObject(new Tool()));
  accessor.DoSomePreparation(new object());
}

しかし、ネストされたクラスにアクセスするにはどうすればよいでしょうか? DoSomePreparation(...) からの結果をモックしたいので必要です。

4

2 に答える 2

1

Tool_Accessor.Result - ネストされたクラスへのアクセサーになります。

于 2013-01-29T10:25:51.973 に答える
1

このような場合の最も一般的な方法は、クラスのパブリック コントラクトをテストし、プライベート コントラクトのテストを避けることです。これは、テストが実際の実装の変更に対してより脆弱になるためです。プライベート メソッドをテストしないように API を設計してみてください。プライベート メソッドのテストが必要な場合、そのような場合、クラスは単一責任の原則に違反する可能性があります。

例として、XML シリアライゼーション。ドメイン・ビジネス・オブジェクトを表すクラス内で XML シリアライゼーションが行われる場合、特にドメイン・オブジェクト間に階層がある場合に継承が使用されます。このような場合、内部で XML シリアライゼーションを実装してそのようなドメイン オブジェクトをテストすることは困難です。しかし、ドメイン オブジェクトの外部で XML シリアライゼーションを実装すると、パブリック コントラクトを使用して、ドメイン オブジェクトと XML シリアライゼーション ロジックを持つオブジェクトの両方を簡単にテストできます。

プライベート メソッドのテストを避けるのが難しい場合があります。.NET のコンテキストでは、そのようなメソッドを internals としてアクセス可能にし、InternalsVisibleTo属性を使用してテストからアクセスできます。

于 2013-01-31T16:08:47.150 に答える