Art*_*yev 4 c# linq unit-testing moq verify
我有一个问题,验证在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 + Select()有什么问题?我怎样才能解决这个问题?
小智 7
不知道什么.Serialize
方法做但.Select
不运行实际查询它只返回一个知道如何迭代的对象IEnumerable<T>
.
随着多个LINQ方法,比如.Where
,.Select
你可以建立一个将被懒惰迭代后通常查询foreach
或打电话.ToList
,.ToDictionary
等等.
因此,要运行LINQ查询,请将其更改为:
.Select(...)
至:
.Select(...).ToList()