2

複雑な科学計算を保持するクラスがあります。ユーザーのみが適切にインスタンス化されたケースを作成できるように設定されています。ただし、コードを適切にテストするには、内部状態変数を直接設定する必要があります。これは、リファレンス ドキュメントがテスト ケースでこのデータを提供しているためです。ただし、不適切に実行すると、状態が無効になる可能性があります。

したがって、単体テスト プログラムから内部変数を設定する機能 (メンバー関数) が必要です。ただし、通常のユーザーがこの関数を呼び出すことは強くお勧めしません。(はい、決心したユーザーは何でもいじることができます...しかし、何か間違ったことをする方法があると宣伝したくありません。)

たとえば、関数を表示しないように Intellisense に指示できると便利です。

現時点での最善の解決策は、関数に DangerousSet() のような名前を付けることです。

他にどのようなオプションがありますか?

ファローアップ

Amy B の回答が私の状況に最も役立つことがわかりました。ありがとう!
リフレクションを使用するという Mufasa の提案は素晴らしいものでしたが、(私にとっては) 実装が困難でした。
デコレーターを使用するという Chris の提案は良かったのですが、うまくいきませんでした。
XML に関する BFree の提案も優れており、すでに使用されていましたが、実際には問題を解決していません。

最後に、問題はソース ドキュメントにあるという BillTheLizard の提案は、私が制御できるものではありません。国際的な専門家は、コミュニティで使用するために高度な専門書や雑誌記事を発行しています。それらが私の特定のニーズに対応していないという事実は、人生の事実です. 単に代替文書はありません。

4

7 に答える 7

14

InternalsVisibleToAttributeを使用して、内部メンバーをテスト アセンブリから見えるようにマークすることができます。この文脈で使用すると、「友達」とは言えませんが、輝いているように見えます。

  1. の代わりにDangerousSet関数をマークします。internalpublic

  2. 次を含むプロジェクトの Properties\AssemblyInfo.cs 内DangerousSet:

    [assembly:InternalsVisibleTo("YourTestAssembly")]

何らかの理由で 2 つのテスト アセンブリがある場合、構文は次のようになります。

[assembly:InternalsVisibleTo("TestAssembly1"), 
    InternalsVisibleTo("TestAssembly2")]
于 2008-10-03T16:31:34.130 に答える
5

メソッドを次の属性で装飾します。

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

これにより、Intellisense から非表示になります。

編集:

しかし、どうやらこれにはかなり重要な警告があります。「Visual C# ではEditorBrowsableAttribute、同じアセンブリ内のクラスのメンバーを抑制しません。」MSDN 経由

于 2008-10-03T16:33:03.317 に答える
4

フィールドを操作してこのオブジェクトをテストするとします。

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: internalと言ったのは知っていますが、 internalという意味ではないと思います。

于 2008-10-03T17:54:05.523 に答える
3

あなたの本当の問題は参照ドキュメントにあるようです。クラスの適切な使用の下で遭遇することが不可能なケースをテストするべきではありません。ユーザーがこれらの変数の状態を変更することを許可されるべきでない場合は、テストも許可されるべきではありません。

于 2008-10-03T16:36:54.913 に答える
1

反射も使えます。Google 検索で、リフレクションを使用したプライベート メソッドの単体テストが見つかりました。

于 2008-10-03T17:53:32.077 に答える
0

テスト コードに計算クラスのサブクラスを含めることができますか? その場合、関数protectedをマークすると、継承者のみがそれを使用できるようになります。これもインテリセンスから外れていると確信していますが、それについては間違っている可能性があります。

于 2008-10-03T16:32:50.070 に答える
0

私が過去に行ったのは、メソッドごとに XML コメントを配置し、そのセクションを使用して大きな太字で記述したことです。この方法などは使用しないでください。そうすれば、誰かがそれを使用しようとすると、Intellisense は適切な警告を表示します。

于 2008-10-03T16:42:26.743 に答える