【问题标题】: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 实例的地方传递包装器。