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是不可接受的?

Expression< Func<祝辞祝辞在Moq's Setup()中,仅内联有效,不通过绑定lambda

为什么,例如,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作为局部变量,它与stringobject都工作得很好。请检查我的配置,如果我错过了什么。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; }
}