プライベート アクセサの使用
更新 : 2007 年 11 月
テスト対象コードのプライベート メソッドまたは内部メソッドにアクセスできるのは呼び出し側の階層内のメソッドだけなので、テスト メソッドには、このような制限付きのアクセス コードを間接的に呼び出すためのプライベート アクセサが必要です。
プライベート アクセサは、テスト対象コードのアセンブリの各メソッドのシャドウ実装を含むアセンブリです。プライベート アクセサの各メソッドはパブリックで、テスト対象コード内の対応するメソッドと同じ名前になります。プライベート アクセサのメソッドを呼び出すと、テスト対象コードのプライベート メソッドが呼び出されます。これにより、private アクセス修飾子を含むコードへのアクセスが簡単になります。
メモ : |
---|
プライベート アクセサを使用すると、テスト対象コード内のプライベート変数にもアクセスできるようになります。 |
プライベート アクセサは、ソリューション エクスプローラの [テストの参照] フォルダにあるコンパイル済みアセンブリです。このアクセサの名前は <assembly_name>.private_accessor で、<assembly_name> はプロジェクトのプロパティに表示されるアセンブリ名を示します。
メモ : |
---|
内部アクセス修飾子を持つ要素をテストする方法の詳細については、「InternalsVisibleTo 属性の設定」を参照してください。 |
プライベート アクセサの作成
プライベート メソッドの単体テストを生成すると、Visual Studio では、プライベート アクセサが自動的に作成されます。ただし、プライベート アクセサがテスト プロジェクトに既に存在する場合は除きます。
ソリューションをビルドすると、プライベート アクセサ内の参照が更新されます。そのため、実行コードを変更したら、プライベート アクセサを再コンパイルして更新する必要があります。
プライベート アクセサの生成方法については、「方法 : プライベート メソッドをテストする」を参照してください。
プライベート アクセサの手動作成
テスト対象のアセンブリにプライベート アクセサが存在しない場合は、テスト メソッドを生成せずに、プライベート アクセサを生成できます。
プライベート アクセサを作成するか、削除されたプライベート アクセサを再作成するには、テスト対象コードを右クリックします。次に、ショートカット メニューの [プライベート アクセサの作成] をクリックし、プライベート アクセサ アセンブリを配置するテスト プロジェクトを選択します。ソリューションにテスト プロジェクトが存在しない場合はこのメニュー項目が表示されないことに注意してください。
メモ : |
---|
publicize ユーティリティを使用して、コマンド プロンプトからプライベート アクセサを作成することもできます。 |
プライベート アクセサの使用
プライベート コードをテストするには、「方法 : プライベート メソッドをテストする」で説明するように、最初にプライベート アクセサを作成します。テストでは、プライベート メソッドにアクセスするオブジェクトをインスタンス化してから、そのテスト手順を実行する必要があります。
たとえば、実行コードに、BankAccount クラスの次のメソッドが含まれています。
private void FreezeAccount()
{
m_frozen = true;
}
次のテスト メソッドでは、プライベート FreezeAccount() メソッドをテストします。FreezeAccount() メソッドにアクセスするには、テスト メソッドは、最初に、プライベート アクセサ アセンブリ内の BankAccount_Accessor オブジェクトをインスタンス化する必要があります。これは、テスト対象のメソッドである、FreezeAccount() のシャドウ実装が BankAccount_Accessor に含まれているためです。次のコードでは、プライベート アクセサのシャドウ実装で FreezeAccount() が呼び出されます。
次のプログラム例は、自動的に生成された後、テストの作成者によって編集されました。TODO ステートメントは、テストの実行前に手動で実行する必要のある、テスト コード内のステートメントを示します。
[TestMethod()]
public void FreezeAccountTest()
{
BankAccount_Accessor target = new BankAccount_Accessor("Mr. Bryan Walton", 11.99); // TODO: Initialize to an appropriate value
target.FreezeAccount();
// Assert.Inconclusive("A method that does not return a value cannot be verified.");
bool creditAccount = false; // False means account could be credited: Fail test.
// Try to credit account
try
{
target.Credit(1.00);
}
catch (System.Exception)
{
// Threw exception. FreezeAccount worked correctly: Pass test.
creditAccount = true;
}
// Assert fails if 'creditAccount' condition is false. Fail test.
Assert.IsTrue(creditAccount, "Was able to credit account.");
}
この例については、「チュートリアル : 単体テストの作成と実行」で詳しく説明します。