【发布时间】:2014-01-23 01:28:01
【问题描述】:
假设我有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 函数)
在 Moq.Mock.Setup(Mock
1 mock, Expression1 表达式, Condition 条件)在 Moq.Mock
1.Setup(Expression1 表达)在 UnitTests.cs 中的 UnitTest() 处:第 38 行
第 38 行是mockDelegate.Setup(x => x.Invoke()).Returns(mockService.Object);
我错过了什么吗?或者模拟委托调用通常不是一个好主意?
谢谢。
【问题讨论】:
-
没有理由这样做。自己做一个代表就行了。
-
谢谢!仍然很有趣,为什么会有一个例外......
-
@NikolaiSamteladze 出现异常是因为 Moq 不支持这种情况,但不是抛出 NotSupportException,而是得到这个不太好的 InvalidCastException。这是我认为的一个错误,因此应该在此处修复异常类型......但无论如何你都应该不要模拟委托,只需写:
Func<IService> mockDelegate = () => mockService.Object; -
是的,正是这样做的。感谢您提供有关异常的详细信息。
-
添加了 cmets 摘要作为答案。如果没人愿意再放一张,明天会接受。
标签: c# linq unit-testing delegates moq