gpt4 book ai didi

c# - Moq 和反射,将动态生成的表达式树/lambda 传递给 moq

转载 作者:行者123 更新时间:2023-11-30 15:06:45 24 4
gpt4 key购买 nike

是否可以编写如下代码。我正在尝试将 Moq 与我作为测试框架的一部分反射(reflect)的对象一起使用。下面的代码引发了 Moq 的“Unhandled expression type: 'Goto'”异常,我想这是在期待一些不同的东西。不过看起来它应该可以工作!

    private void button1_Click(object sender, EventArgs e)
{
Ifoo = foo Foo();

// Create input parameter for lambda
ParameterExpression value = Expression.Parameter(typeof(IFoo), "value");

// create return statement for lambda
Expression setupProperty = Expression.Return(Expression.Label(), Expression.Property(value, "Bar"), typeof(string));

// convert expression to lambda (should now be the equivalent of "v => v.Bar")
var func = Expression.Lambda<Func<IFoo, string>>(setupProperty, value);//.Compile();
//string s = func(foo); // this bit works fine if .Compile() is included

var mockFoo = new Mock<IFoo>();

mockFoo.SetupProperty(func); // exception thrown by moq here, obviously isn't exactly the same as "v => v.Bar"
mockFoo.Object.Bar = "Burge+";
}

谢谢!

最佳答案

好的,这是可能的,这是更正后的代码。

// Create input parameter for lambda 
ParameterExpression value = Expression.Parameter(typeof(IFoo), "value");

// create return statement for lambda
Expression setupProperty = Expression.Property(value, "Bar");

// convert expression to lambda (should now be the equivalent of "v => v.Bar")
var func = Expression.Lambda<Func<IFoo, string>>(setupProperty, value);

var mockFoo = new Mock<IFoo>();
mockFoo.SetupProperty(func); // this works now
mockFoo.Object.Bar = "Burge+";

我通过使用下面的代码从 lambda 创建一个表达式来调查这个问题

Expression<Func<IFoo, string>> setupBar = v => c.Bar;

然后我在 vs 2010 的调试器中查看了这个。表达式有一个“调试 View ”,显示表达式的文本表示,因此可以在上面添加一个监视或类似的东西。以上结果为

 .Lambda #Lambda1<System.Func`2[WindowsFormsApplication1.IFoo,System.String]>(WindowsFormsApplication1.IFoo
$v) {
$v.Bar
}

我查看了这个并试图找出什么表达式会产生这个,然后创建一个表达式并在调试器中进行比较。

对我来说有趣的是,虽然这个表达式返回一个值,但没有赋值或返回语句。我想这一定是隐含的。

关于c# - Moq 和反射,将动态生成的表达式树/lambda 传递给 moq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7334184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com