为受保护的虚拟方法设置一个Moq调用,该方法期望一个Func并返回一个IEnumerable

本文关键字:一个 方法 期望 Func 返回 IEnumerable 调用 虚拟 受保护 Moq 设置 | 更新日期: 2023-09-27 18:13:19

我有以下代码:

public class MyClass
{
    protected virtual IEnumerable<TResult> MyMethod<TResult>(Func<IDataReader, IEnumerable<TResult>> arg)
    {
       ....
    }
} 

如何设置模拟方法?

我尝试遵循,但得到一个错误。

using Moq;
using Moq.Protected;
namespace Foo
{
    [TestClass]
    public class TestClass
    {
        Mock<MyClass> m_mockObject = null;
        [TestMethod]
        public void MyTest()
        {
            m_mockObject = new Mock<MyClass>();
            AddMethod<Func<IDataReader, IEnumerable<SomeOtherClass>>, IEnumerable<SomeOtherClass>>(this.MyMethod);
        }
        private void AddMethod<TIn, TResult>(Func<TIn, TResult> method)
        {
             m_mockObject.Protected().Setup<TResult>(method.Method.Name, ItExpr.IsAny<TIn>())
                                                    .Returns(method); /* THIS LINE IS THROWING THE EXCEPTION */
        }
        public IEnumerable<TResult> MyMethod<TResult>(Func<IDataReader, IEnumerable<TResult>> arg)
        {
            ....
        }
    }
}

一旦我运行代码,我在调用Setup函数时得到以下错误:

<>之前>系统。用户代码未处理ArgumentExceptionHResult = -2147024809消息=类型为"System"的表达式。Object不能用于返回类型System.Collections.Generic.IEnumerable 1[SomeOtherClass]源=系统。核心加:在System.Linq.Expressions.Expression。ValidateLambdaArgs(typedelegatetype, expression&body, ReadOnlyCollection ' 1参数)在System.Linq.Expressions.Expression。Lambda[TDelegate](表达式主体,字符串名称,布尔值tailCall, IEnumerable ' 1参数)在System.Linq.Expressions.Expression。Lambda[TDelegate](表达式主体,Boolean tailCall, IEnumerable ' 1参数)在System.Linq.Expressions.Expression。Lambda[TDelegate](表达式体,ParameterExpression[]参数)在Moq.Protected.ProtectedMock 1。设置[结果](String methodOrPropertyName, Object[] args).….....InnerException:

为受保护的虚拟方法设置一个Moq调用,该方法期望一个Func并返回一个IEnumerable

不确定为什么要返回一个方法。但是你能不能把它改成:

m_mockObject.Protected().Setup<IEnumerable<TResult>>(method.Method.Name, ItExpr.IsAny<TIn>()).Returns(new List<TResult>());

myMethod1返回一个IEnumerable<TResult>,而不是我认为你所期望的一个委托。

我相信我找到了问题的根本原因,Mock。当对泛型方法使用反射时,Protected没有做正确的事情,下面的链接提供了更多关于他们错误的根本原因的详细信息,他们没有使用GetMethods

获取泛型方法

非常感谢你的帮助