小编Art*_*yev的帖子

无法验证使用Moq框架调用Select()内部的方法

我有一个问题,验证在LINQ Select()查询中的模拟调用某个方法.

这是我想要测试的ContentManager的方法:

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

    return Serialize(processed);
}
Run Code Online (Sandbox Code Playgroud)

我想测试是否为列表的元素调用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());
}
Run Code Online (Sandbox Code Playgroud)

当我运行此测试时它失败并返回以下消息:

测试方法ProcessItems_ValidItems_ProcessCalled抛出异常:

Moq.MockException:

模拟上的预期调用至少一次,但从未执行过:

m => m.Process(It.IsAny())

没有配置设置.

没有进行任何调用.

但是,如果我将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);
}
Run Code Online (Sandbox Code Playgroud)

Moq …

c# linq unit-testing moq verify

4
推荐指数
1
解决办法
360
查看次数

标签 统计

c# ×1

linq ×1

moq ×1

unit-testing ×1

verify ×1