[英]Moq TargetParameterCountException with lambda expression
[英]Moq and reflection, passing dynamically generated expression tree / lambda to moq
是否可以编写如下代码。 我正在尝试将Moq与我正在反思的对象一起用作测试框架的一部分。 下面的代码从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 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+";
我通过使用下面的代码从lambda创建表达式来调查这一点
Expression<Func<IFoo, string>> setupBar = v => c.Bar;
然后我在vs 2010中的调试器中查看了这个。表达式有一个“调试视图”,它显示了表达式的文本表示,因此可以在该类或类似的东西上添加监视。 以上是出自
.Lambda #Lambda1<System.Func`2[WindowsFormsApplication1.IFoo,System.String]>(WindowsFormsApplication1.IFoo
$v) {
$v.Bar
}
我查看了这个并试图找出表达式会做什么,然后创建一个表达式并在调试器中进行比较。
对我来说有趣的是,虽然这个表达式返回一个值,但是没有赋值或返回语句。 我猜这必须以某种方式隐含。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.