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

问题描述:

是否有可能编写如下所示的代码。我试图将Moq与作为测试框架一部分反思的对象一起使用。下面的代码提出了一个“未处理的表达式类型:从Moq转到'异常',我猜这是一个不同的东西。它看起来像它应该工作,但!Moq和反射,将动态生成的表达式树/ lambda传递给moq

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 in .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+"; 

我调查这通过以下

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

我然后在调试器搜索这在2010年VS表达式的代码从一个lambda创建表达产生“Debug视图”,显示一个表达式的文本表示,因此可以在该表单上添加一个手表或类似的东西。上面出来的

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

我看着这一点,并试图弄清什么表达式将使这个,然后创建一个表达式并在调试器进行了对比。

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