c#单元测试:如何创建COM互操作值的测试输入?



在我的应用程序中,有一个方法接受Object,然后对其执行一些操作以返回c#long值。运行时,从Active Directory接收到的ObjectIADSLargeInteger

在为这段代码编写单元测试时,我无法创建这样一个对象来传递到被测试的方法中。

我如何为我的单元测试创建这样一个对象?还有其他方法可以验证我的方法的逻辑吗?

测试方法:

public static long ConvertLargeIntegerToLong(object largeInteger)
{
var type = largeInteger.GetType();
var highPart = (int)type.InvokeMember("HighPart", BindingFlags.GetProperty, null, largeInteger, null)!;
var lowPartInt = (int)type.InvokeMember("LowPart", BindingFlags.GetProperty | BindingFlags.Public, null, largeInteger, null)!;
uint lowPartUint;
unchecked
{
lowPartUint = (uint)lowPartInt;
}
return (long)highPart << 32 | (long)lowPartUint;
}

单元测试示例

public void ConvertLargeIntegerToLong_ComObjectLargeInt_Long()
{
var expectedValue = 94294967295;
var testValue = ??; // What to put here? 
var result = ConvertLargeIntegerToLong(testValue);
Assert.AreEqual(expectedValue, result);
}

问完问题后,我继续四处寻找,并考虑将activeds.dll作为COM引用添加到我的测试项目中。

这样做之后,我可以直接访问IADSLargeInteger接口。仔细查看微软文档的接口,看到了一个为VB.Net创建这样一个对象的例子。

最后,我对我的代码这样做了(仍然保持COM引用):

var testValue = new LargeInteger { HighPart = 1234, LowPart = 4567 };

LargeInteger也在DLL中,并且是实现接口的具体类——正如@Hans Passant在他的评论中提到的。

最新更新