1

私はSystem.Security.Cryptography.CspParametersクラスのために、より具体的には。のためにほくろを作成しようとしていますKeyContainerName。問題は、そのためのモグラデリゲートがIntellisenseに表示されないことです。これが私が使用しているコードです:

MCspParameters.AllInstances.KeyContainerNameSetString = (
    CspParameters parameters, 
    string name) =>
{
   // ...
}

KeyContainerNameSetString実際には利用できません。KeyContainerNameこれは、フィールドであり、プロパティではないためだと思います。

このフィールドをテストできるように、このフィールドをどのようにモール化できるかについてのアイデアはありますか?

4

2 に答える 2

0

公共の場を迂回する方法はないようです。したがって、特定のフィールドが特定の値に設定されていることを確認したい場合は、運が悪いことになります。回避策として、クラスの各フィールドに対応するプロパティを持つクラスのラッパーを作成しCspParameters、プログラム内の可能な限りラッパーを使用して、テストでプロパティを迂回させることができると思います。

おそらく、ラッパーからの暗黙的な変換を実装して、のインスタンスが必要なCspParameters場所にラッパーを渡すことができるようにすることもできます。CspParameters

于 2012-05-17T16:47:06.747 に答える
0

フィールドはデフォルトで書き込み可能であるため、その場合は Moles を使用する必要はなく、必要な値に設定するだけです。

cspParameters.KeyContainerName = "MyContainerName";

ただし、使用しているため、モルしたいインスタンスは制御外で作成され、使用する前に設定できないとMCspParameters.AllInstances想定します。CspParameters

その場合、そのクラスの他のすべてのコンストラクターによって呼び出されるコンストラクターをモールし、質問のフィールドを特定の値に設定するだけです。このようなもの:

[TestMethod()]
[HostType("Moles")]
public void Test()
{
    MCspParameters.ConstructorInt32StringStringCspProviderFlags = (
        p, 
        providerType, 
        providerName, 
        keyContainerName, 
        flags) => 
    {
        p.ProviderType = providerType;
        p.ProviderName = providerName;
        p.KeyContainerName = "MyContainerName";
        p.KeyNumber = -1;
        p.Flags = flags;
    };

    CspParameters cspParameters = new CspParameters(1);

    Assert.AreEqual(cspParameters.ProviderType, 1);
    Assert.AreEqual(cspParameters.KeyContainerName, "MyContainerName");
}
于 2012-05-17T16:41:34.567 に答える