如何修改实例字段?

时间:2012-05-17 15:56:29

标签: c# visual-studio-2010 unit-testing moles

我正在尝试为System.Security.Cryptography.CspParameters类创建一个痣,更具体地说是KeyContainerName。问题是,代理它的痣不会出现在Intellisense中。这是我正在使用的代码:

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

KeyContainerNameSetString实际上无法使用。我认为这是因为KeyContainerName是一个字段,而不是一个属性。

关于如何训练这个领域的任何想法,以便我可以测试它?

2 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分:0)

似乎没有办法绕道公共场地。因此,如果您想确保某个特定字段已设置为某个值,那么您运气不好。我想作为一种解决方法,你可以为CspParameters类创建一个包装器,它具有与其每个字段相对应的属性,并在程序中的任何地方使用包装器并绕过测试中的属性。

您可能还可以实现从包装器到CspParameters的隐式转换,以便能够在需要CspParameters的实例的情况下传递包装器。