【问题标题】:Mocking indexed property模拟索引属性
【发布时间】:2012-07-16 05:51:32
【问题描述】:

我正在使用 Moq 编写单元测试。我创建了一个模拟对象。现在,当我尝试模拟它的属性时,我收到错误“表达式树可能不包含索引属性”

这是我的代码。

public Node GetNode(IMyInterface interface, string itemName)
{
    return interface.Items[itemName];
}

这是单元测试

var expected = new Node();
var itemName = "TestName";
var mock = new Mock<IMyInterface>();
mock.Setup(f => f.Items[itemName]).Returns(expected);
var target = new MyClass();

var actual = target.GetNode(mock.Object, itemName);
Assert.AreEqual(expected, actual);

这一行给了我错误。

mock.Setup(f => f.Items[itemName]).Returns(expected);

我怎样才能moq这个功能。

【问题讨论】:

  • 这不是起订量问题。表达式树不能包含错误状态的索引属性。您应该重构您的代码以访问列表中的项目而不使用索引。
  • 我无法更改“interface.Items[itemName];”因为我是通过 COM 得到它的,所以在测试中可以通过任何方式做到这一点,
  • 物品到底是什么?能否提供完整的接口定义?
  • 它是一个节点列表(一个类),
  • 好吧,既然抽象的全部意义在于将接口与实现分离,并且在一定程度上简化事情,如果它确实是一个通用 List 并且您正在测试接口属性,您可以使用 linq 运算符按名称检索项目。在您的财产中,您将进行 linq-COM 翻译。

标签: c# unit-testing moq


【解决方案1】:

接口是一个COM对象并且有get函数,所以不要使用索引器直接访问属性,而是使用get函数,

mock.Setup(f => f.get_Items(itemName)).Returns(expected); 

【讨论】:

  • 你试过mock.Setup(f =&gt; f[itemName]).Returns(expected);吗?不确定它是否适用于您的情况(COM)(什么 C# 和 .NET 版本?),但看起来好多了。
【解决方案2】:

在 ASP.NET Core 2.2 中使用 Moq,get_Items 设置不起作用。但这确实:

Mock<IConfiguration> configuration = new Mock<IConfiguration>();
configuration.Setup(x => x[key]).Returns(value);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多