質問
複雑な科学計算を保持するクラスがあります。ユーザーが適切にインスタンス化されたケースのみを作成できるように設定されています。ただし、コードを適切にテストするには、内部状態変数を直接設定する必要があります。これは、参照ドキュメントがテストケースでこのデータを提供するためです。不適切に行われましたが、状態が無効になる可能性があります。
そのため、単体テストプログラムから内部変数を設定する機能、メンバー関数が必要です。しかし、通常のユーザーがこの関数を呼び出すことを強く阻止したいと思います。 (はい、決心したユーザーは何でもいじることができますが、間違っているを行う方法があることを広告したくありません。)
たとえば、Intellisenseに関数を表示しないように指示できると便利です。
私が現時点で持っている最良の解決策は、関数にDangerousSet()のような名前を付けることです。
他にどんなオプションがありますか?
フォローアップ
デビッドBの答えが私の状況に最も役立つことがわかりました。ありがとう!
リフレクションを使用するというMufasaの提案は素晴らしかったが、実装するのは難しい(私にとって)。
デコレーターを使用するというクリスの提案は良かったが、うまくいかなかった。
BFreeのXMLに関する提案も良好であり、既に使用されていますが、実際には問題を解決しません。
最後に、問題がソース文書にあるというBillTheLizardの提案は、私が制御できるものではありません。国際的な専門家は、コミュニティで使用するための高度に技術的な書籍や雑誌記事を公開しています。彼らが私の特定のニーズに対応していないという事実は、人生の事実です。代替文書はありません。
解決
フィールドを操作してこのオブジェクトをテストするとします。
public class ComplexCalculation
{
protected int favoriteNumber;
public int FavoriteNumber
{
get { return favoriteNumber; }
}
}
このオブジェクトをテストアセンブリ/ネームスペースに配置します:
public class ComplexCalculationTest : ComplexCalculation
{
public void SetFavoriteNumber(int newFavoriteNumber)
{
this.favoriteNumber = newFavoriteNumber;
}
}
テストを作成します:
public void Test()
{
ComplexCalculationTest myTestObject = new ComplexCalculationTest();
myTestObject.SetFavoriteNumber(3);
ComplexCalculation myObject = myTestObject;
if (myObject.FavoriteNumber == 3)
Console.WriteLine("Win!");
}
PS:内部と言ったことは知っていますが、内部。
他のヒント
InternalsVisibleToAttribute を使用して、内部メンバーをテストアセンブリから見えるようにマークします。このコンテキストで使用すると、「友人」ではありませんが輝いているようです。
-
public
ではなく、DangerousSet
関数をinternal
にマークします。 -
DangerousSet
を含むプロジェクトのProperties \ AssemblyInfo.cs:[assembly:InternalsVisibleTo(" YourTestAssembly")]
何らかの理由で2つのテストアセンブリがある場合、構文は次のとおりです。
[assembly:InternalsVisibleTo("TestAssembly1"),
InternalsVisibleTo("TestAssembly2")]
この属性を使用してメソッドを装飾します:
[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
これにより、Intellisenseから非表示になります。
編集:
しかし、これにはかなり重要な警告があります:" Visual C#では、 EditorBrowsableAttribute
は同じアセンブリ内のクラスのメンバーを抑制しません。 MSDN経由。
あなたの本当の問題はあなたの参考文書にあるようです。クラスを適切に使用することで発生する可能性のないケースをテストしないでください。ユーザーがこれらの変数の状態を変更することを許可されない場合、テストも同様です。
リフレクションを使用することもできます。 Google検索がリフレクションを使用したプライベートメソッドのユニットテスト。
テストコードに計算クラスのサブクラスを含めることはできますか?その場合、関数を protected
にマークすれば、継承者のみがそれを使用できます。これによりインテリセンスからも外れることは確かですが、間違っている可能性があります。
過去に行ったことは、XMLコメントをメソッドごとに配置し、セクションを使用して大きな太字で書くことです。この方法などは使用しないでください。そうすれば、誰かがそれを使用しようとした場合、Intellisenseはそれらにいい警告を与えます。