为受保护的虚拟方法设置一个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:不确定为什么要返回一个方法。但是你能不能把它改成:
m_mockObject.Protected().Setup<IEnumerable<TResult>>(method.Method.Name, ItExpr.IsAny<TIn>()).Returns(new List<TResult>());
myMethod1
返回一个IEnumerable<TResult>
,而不是我认为你所期望的一个委托。
我相信我找到了问题的根本原因,Mock。当对泛型方法使用反射时,Protected没有做正确的事情,下面的链接提供了更多关于他们错误的根本原因的详细信息,他们没有使用GetMethods
获取泛型方法非常感谢你的帮助