C# Moq模拟foreach循环

C# Moq模拟foreach循环,c#,unit-testing,moq,C#,Unit Testing,Moq,我想循环遍历XmlNodeList。如何在Moq中模拟XmlNodeList,以便像在foreach循环中一样循环它: foreach (XmlNode xmlNode in nodes) { //Do something with node } 我试图通过SetupSequence方法进行设置,但未能创建所需的模拟 foreach在引擎盖下调用GetEnumerator,这就是您需要模拟的: var xmlNodesMo

我想循环遍历XmlNodeList。如何在Moq中模拟XmlNodeList,以便像在foreach循环中一样循环它:

        foreach (XmlNode xmlNode in nodes)
        {
            //Do something with node
        }

我试图通过
SetupSequence
方法进行设置,但未能创建所需的模拟

foreach在引擎盖下调用
GetEnumerator
,这就是您需要模拟的:

var xmlNodesMock = new Mock<XmlNodeList>();
xmlNodesList
    .Setup(l => l.GetEnumerator())
    .Returns(new XmlNode[] { /* values go here */ }.GetEnumerator());
var xmlNodesMock=new Mock();
xmlNodesList
.Setup(l=>l.GetEnumerator())
.Returns(新的XmlNode[]{/*值放在这里*/}.GetEnumerator());

当然,您需要使用实际值初始化
XmlNode
方法中的
XmlNode
数组。请记住,被嘲笑的列表必须被注入到测试的方法中,这样你就可以替换实际的实现。

很难理解通过这个测试你想要达到什么,但是你可能想考虑在这里做一个综合测试而不是一个单元测试,提供xml的字符串表示,并在真实数据上测试循环。我所处的灰色区域是正确的,在这里可以讨论真实单元测试的价值。然而,这在其他不太灰色的区域也很有用。我不会在所有foreach循环中遇到同样的问题吗?不同之处在于循环的对象是什么——xml文档比任何其他集合都复杂,因此可能不是简单单元测试的最佳候选对象,这显然取决于您正试图测试的对象。此外,这个问题可能是一个很好的指标,让你重新思考你的设计?“我只是想一想。”内夫谢谢你让我了解莫克的能力,这对我来说完全是新闻。更有用的是,
foreach
是否隐式调用了
foreach
ed的
GetEnumerator
方法?也许模仿这种方法可以让你得到你想要的东西。模仿某种东西的整个想法可以节省我们的时间,更重要的是将我们的测试与其他依赖项“分离”。在这种情况下,尽管我们没有完整的代码(因此很难说),但似乎您最终还是会通过“设置”模拟对象或设置真实对象来完成确切的工作,因此我建议您这样做。