如何解决如何最小化 IEnumerable<T> 以通过 Any() 条件检查
我在将 Moq
框架与 IEnumerable
一起使用时遇到了一些问题。我对模拟对象没有任何问题,但我对模拟对象的 IEnumerable
、ICollection
等等有一些不明白的地方。
例如:
[TestMethod]
public void Unittest()
{
var mockedExample = new Mock<IEnumerable<Class>>();
var Feedback = repository.someMethod(mockedExample.Object);
}
public void SomeMethod(IEnumerable<Class> input)
{
if (input != null && input.Any())
{
//Stuff to do
}
}
我的问题是当我检查输入时。我通过了 input != null
条件,但在 input.Any()
条件上出现错误。
如何设置模拟的 IEnumerable 以通过这两个条件?
提前致谢。
解决方法
正如人们所说,我认为您不需要在这里进行模拟。我认为评论中提供了正确的选项。
但是要回答您的问题:您应该指定 Any 方法的行为(使用模拟上的“setup”方法):
mockedExample.Setup(m => m.Any()).Returns(true);
但是如果您尝试这样做,您将遇到此异常:
System.NotSupportedException: '不支持的表达式:m => m.Any() 扩展方法(此处:Enumerable.Any)可能不是 用于设置/验证表达式。'
那是因为,“Any”不是 IEnumerable 接口的一部分(即使它的用法往往让您相信它是)。 “Any”是IEnumerable的一个扩展方法(所以基本上是一个简单的静态方法)。
public static bool Any<TSource> (this System.Collections.Generic.IEnumerable<TSource> source)
这基本上意味着您不能直接使用 Moq 模拟“Any”方法的行为。
但是如果您检查“Any”方法中的内容:
public static bool Any<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw new Exception();
}
using (IEnumerator<TSource> e = source.GetEnumerator())
{
return e.MoveNext();
}
}
当您的模拟对象的 GetEnumerator 被调用时,返回的默认值(因为您没有为其设置任何行为)为“null”,因此“e.MoveNext()”调用失败。因此,您可以定义“GetEnumerator”行为并使其工作,但我真的认为注释中提供的解决方案更简单,并且代码更易读。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。