模拟库Moq有一个带有签名的 Setup() 方法:
public ISetup<T, TResult> Setup<TResult>(Expression<Func<T, TResult>> expression)
所以我可以做这样的事情就好了(使用库的递归模拟):
Mock<Thing> _thing = new Mock<Thing>();
_thing.Setup((Thing t) => t.PropA.SubPropB).Returns(string.Empty);
但这失败了:
Expression<Func<Thing, object>> test = (Thing t) => t.PropA.SubPropB;
_thing.Setup(test).Returns(string.Empty);
出现错误:
Expression is not a method invocation: t => (Object)t.PropA.SubPropB
内联 lambda 和首先分配给变量的 lambda 有什么区别?不是两个表达式树都还没有编译(Moq 解析树)?
编辑 - 看起来问题出在Func<Thing, object>
打字上。例如,为什么string
可以接受,但object
不能接受?