Expression< Func<祝辞祝辞在Moq's Setup()中,仅内联有效,不通过绑定lambda
本文关键字:lambda 有效 绑定 Setup lt Func Moq Expression | 更新日期: 2023-09-27 17:53:20
mock库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
是不可接受的?
为什么,例如,string是可接受的,而object是不可接受的?
,因为moq
中的函数声明不是泛型协变的。尝试用另一种方式设置moq
_thing.Setup(test).Returns((object)string.Empty);
因为你有下一个签名Expression<Func<Thing, object>>
而且它对object
不是协变的
或者像这样将签名更改为string
(假设t.PropA.SubPropB
返回字符串):
Expression<Func<Thing, string>> test = (Thing t) => t.PropA.SubPropB;
//^here should be string
实际情况我已经创建了一个测试项目,Expression
作为局部变量,它与string
和object
都工作得很好。请检查我的配置,如果我错过了什么。Moq - 4.0.10827v
[TestFixture]
public class Class1
{
[Test]
public void TestMethod()
{
Mock<Thing> _thing = new Mock<Thing>();
Expression<Func<Thing, string>> setup = t => t.PropA.SubPropB;
// ^ works with string and object
_thing.Setup(setup).Returns(string.Empty);
Assert.IsEmpty(_thing.Object.PropA.SubPropB);
}
}
public class Thing
{
public virtual Thingy PropA { get; set; }
}
public class Thingy
{
public virtual string SubPropB { get; set; }
}