【问题标题】:How to Mole an instance field?如何 Mole 一个实例字段?
【发布时间】:2012-05-17 15:56:28
【问题描述】:

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

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

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

有什么想法可以让我测试这个字段吗?

【问题讨论】:

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


【解决方案1】:

默认情况下,字段是可写的,因此在这种情况下不需要使用 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");
}

【讨论】:

    【解决方案2】:

    似乎没有办法绕过公共领域。因此,如果您想确保某个特定字段已设置为某个值 - 您很不走运。我想作为一种解决方法,您可以为 CspParameters 类创建一个包装器,该类具有与它的每个字段对应的属性,并在程序中尽可能使用包装器并在测试中绕过属性。

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

    【讨论】:

      猜你喜欢
      • 2016-02-07
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      相关资源
      最近更新 更多