如何最小化 IEnumerable<T> 以通过 Any() 条件检查

如何解决如何最小化 IEnumerable<T> 以通过 Any() 条件检查

我在将 Moq 框架与 IEnumerable 一起使用时遇到了一些问题。我对模拟对象没有任何问题,但我对模拟对象的 IEnumerableICollection 等等有一些不明白的地方。

例如:

[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)

Source is here.

这基本上意味着您不能直接使用 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?