我有以下代码。
public class MyClass
{
protected virtual IEnumerable<TResult> MyMethod<TResult>(Func<IDataReader, IEnumerable<TResult>> arg)
{
....
}
}
如何为此设置Mock方法?
我尝试过关注但收到错误。
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函数时出现以下错误。
> System.ArgumentException was unhandled by user code HResult=-2147024809 Message=Expression of type 'System.Object' cannot be used for return type 'System.Collections.Generic.IEnumerable`1[SomeOtherClass]' Source=System.Core StackTrace: at System.Linq.Expressions.Expression.ValidateLambdaArgs(Type delegateType, Expression& body, ReadOnlyCollection`1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable`1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, Boolean tailCall, IEnumerable`1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, ParameterExpression[] parameters) at Moq.Protected.ProtectedMock`1.Setup[TResult](String methodOrPropertyName, Object[] args) .... ..... InnerException:
答案 0 :(得分:3)
不确定为什么要返回一个方法..但是你可以尝试将其更改为:
m_mockObject.Protected().Setup<IEnumerable<TResult>>(method.Method.Name, ItExpr.IsAny<TIn>()).Returns(new List<TResult>());
看看是否有效..
答案 1 :(得分:1)
myMethod1
会返回IEnumerable<TResult>
,而不是我认为您期待的代表。
答案 2 :(得分:0)
我相信我找到了问题的根本原因,Mock.Protected在为通用类型方法使用反射时没有做正确的事情,以下链接提供了有关它们有bug的根本原因的更多详细信息{{3} }
非常感谢你的帮助。