假设我有一个 IService
接口:
public interface IService
{
string Name { get; set; }
}
还有一个委托 Func<IService>
,返回这个接口。
在我的单元测试中,我想使用Moq来模拟委托的 Invoke()
方法,就像这样:
[TestMethod]
public void UnitTest()
{
var mockService = new Mock<IService>();
var mockDelegate = new Mock<Func<IService>>();
mockDelegate.Setup(x => x.Invoke()).Returns(mockService.Object);
// The rest of the test
}
不幸的是,mockDelegate.Setup(...)
抛出了 System.InvalidCastException
异常:
测试方法 UnitTest 抛出异常:
System.InvalidCastException: 无法将类型为“System.Linq.Expressions.InstanceMethodCallExpressionN”的对象强制转换为类型“System.Linq.Expressions.InvocationExpression”。
在 Moq.ExpressionExtensions.GetCallInfo(LambdaExpression expression, Mock mock) 中
在 Moq.Mock.<>c_DisplayClass1c`2.b_1b() 中
在 Moq.PexProtector.Invoke(Func`1 function) 中
在 Moq.Mock.Setup(Mock
1 mock, Expression
1 expression, Condition condition) 中在 Moq.Mock
1.Setup(Expression
1 expression) 中在 UnitTest() 中,位于 UnitTests.cs 的第 38 行
第 38 行是:mockDelegate.Setup(x => x.Invoke()).Returns(mockService.Object);
我是否漏掉了什么?或者说,通常模拟委托调用并不是一个好主意吗?
谢谢。
Func<IService> mockDelegate = () => mockService.Object;
- nemesv