我正在尝试为System.Security.Cryptography.CspParameters
类创建一个痣,更具体地说是KeyContainerName
。问题是,代理它的痣不会出现在Intellisense中。这是我正在使用的代码:
MCspParameters.AllInstances.KeyContainerNameSetString = (
CspParameters parameters,
string name) =>
{
// ...
}
KeyContainerNameSetString
实际上无法使用。我认为这是因为KeyContainerName
是一个字段,而不是一个属性。
关于如何训练这个领域的任何想法,以便我可以测试它?
答案 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
的实例的情况下传递包装器。