我正在尝试测试使用来自 C++/CLI 包装器的动态属性的 C# 方法。我试图模拟的界面是
property Object^ DynamicValueItem
{
[returnvalue: System::Runtime::CompilerServices::DynamicAttribute]
Object^ get () ;
}
我要测试的方法是
public void GetBillInfo (IConfigurationItem item)
{
dynamic ValueItem = item.DynamicValueItem;
string Curr = ValueItem.Currency;
string Ser = ValueItem.BillSeries;
}
我的测试方法是
[TestMethod()]
public void GetBillInfoTest()
{
BnrHelperMethods target = new BnrHelperMethods();
var ValueItem = new
{
Currency = "USD",
BillValue = 100,
};
var mockItem = new Mock<IConfigurationItem>();
mockItem.Setup(i => i.DynamicValueItem).Returns(ValueItem);
target.GetBillInfo(mockItem.Object);
}
我从http://blogs.clariusconsulting.net/kzu/how-to-mock-a-dynamic-object/获得了模拟动态属性的方法
该示例适用于标准 C# 动态属性,因此我必须调整我的 C++/CLI 属性以尝试获得相同的效果。我的问题是,当我执行测试时,我得到一个 RuntimeBinderException 说明该对象不包含货币的定义。如果我查看 Locals 窗口,它会同时显示 Currency 和 BillValue
-ValueItem { Currency = USD, BillValue = 100 } 动态{<>f__AnonymousType1}
-BillValue 0x00000064 int
-Currency "USD" 字符串
正常使用该方法时,它可以工作。我看到的唯一区别是 Currency 和 BillValue 位于 Local 窗口中的 Dynamic View 项下
-ValueItem {} 动态 {MEIConfiguration.ConfigurationValueItem}
-动态视图 展开动态视图将获得对象的动态成员
-BillValue 0x000003e8 System.Int32
-Currency "GBP" System.String
我是否正确定义了 C++/CLI 属性?我是否正确创建了模拟?谁能告诉我我做错了什么?