在我的应用程序中,有一个方法接受Object
,然后对其执行一些操作以返回c#long
值。运行时,从Active Directory接收到的Object
为IADSLargeInteger
。
在为这段代码编写单元测试时,我无法创建这样一个对象来传递到被测试的方法中。
我如何为我的单元测试创建这样一个对象?还有其他方法可以验证我的方法的逻辑吗?
测试方法:
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在他的评论中提到的。