我在验证LINQ Select()查询中的模拟上是否调用了某些方法时遇到问题。
这是我要测试的ContentManager的方法:

public string ProcessElements(List<Item> items)
{
    var processed = items.Select(item => item.Process(Constants.Text));

    return Serialize(processed);
}
我想测试是否为列表的元素调用了Process()。我的测试方法如下:
[TestMethod]
public void ProcessItems_ValidItems_ProcessCalled()
{
    var contentManager = new ContentManager();
    var itemMock = new Mock<Item>();
    itemMock.Setup(m => m.Process(It.IsAny<string>()))
        .Returns("serialized");

    contentManager.ProcessElements(new List<Item>() { itemMock.Object });

    itemMock.Verify(m => m.Process(It.IsAny<string>()), Times.Once());
}
当我运行此测试时,它失败并返回以下消息:

但是如果我将Select()更改为foreach,则,则测试成功通过:
public string ProcessElements(List<Item> iitem)
{
    var processed = new List<string>();
    foreach (var item in iitem)
    {
        processed.Add(item.Process(Constants.Text));
    }

    return Serialize(processed);
}
Moq + Select()有什么问题?我怎样才能解决这个问题?

最佳答案

不知道.Serialize方法做什么,但是.Select不运行实际查询,它仅返回知道如何遍历IEnumerable<T>的对象。

使用.Where.Select等多种LINQ方法,您可以构建查询,稍后通常通过foreach或对.ToList.ToDictionary的调用来延迟迭代查询。

因此,要运行LINQ查询,请将其更改为:
.Select(...)
至:
.Select(...).ToList()

10-06 13:27
查看更多