1

我正在尝试测试使用来自 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 属性?我是否正确创建了模拟?谁能告诉我我做错了什么?

4

1 回答 1

1

对于任何对此感兴趣的人是同事提供的解决方案。

[TestMethod()]
public void GetBillInfoTest()
{
    BnrHelperMethods target = new BnrHelperMethods();

    dynamic valueItem = new ExpandoObject();
    valueItem.Currency = "USD" ;
    valueItem.BillValue = 100;

    var mockItem = new Mock<IConfigurationItem>();

    mockItem.Setup(i => i.DynamicValueItem).Returns ((object)valueItem);

    target.GetBillInfo(mockItem.Object);
}
于 2013-10-18T16:55:41.023 回答