为什么我的动态模拟不起作用

时间:2013-09-19 20:39:04

标签: c# dynamic c++-cli moq

我正在尝试测试一个使用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,指出该对象不包含Currency的定义。如果我查看Locals窗口,它会显示Currency和BillValue

-ValueItem {Currency = USD,BillValue = 100}     动态{&LT;&GT; f__AnonymousType1}
-BillValue 0x00000064 int
- 货币“美元”字符串

正常使用该方法时,它可以正常工作。我看到的唯一区别是Currency和BillValue位于Local窗口的Dynamic View项目下

-ValueItem {} dynamic {MEIConfiguration.ConfigurationValueItem}
- 动态视图扩展动态视图将获得对象的动态成员
-BillValue 0x000003e8 System.Int32
-Currency“GBP”System.String

我是否正确定义了C ++ / CLI属性? 我正确地创建了模拟吗? 谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分: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);
}