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

本文关键字:不起作用 模拟 动态 我的 为什么 | 更新日期: 2023-09-27 18:31:58

我正在尝试测试一个使用 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,指出该对象不包含货币的定义。如果我查看"局部变量"窗口,它同时显示"货币"和"账单价值

"

-价值项目 { 货币 = 美元,账单价值 = 100 } 动态{<>f__AnonymousType1}
-账单价值 0x00000064 int
-货币"美元"字符串

当正常使用该方法时,它可以工作。我看到的唯一区别是货币和账单价值位于"本地"窗口中的动态视图项下

-ValueItem {} dynamic {MEIConfiguration.ConfigurationValueItem}
-动态视图 展开动态视图将获得对象的
动态成员-BillValue 0x000003e8 System.Int32
-货币"英镑"系统.字符串

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

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

对于任何对此感兴趣的人,都可以使用同事提供的解决方案。

[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);
}