Passing expression trees into Moq

71 views
Skip to first unread message

benny

unread,
Sep 22, 2011, 4:59:08 AM9/22/11
to Moq Discussions
Is it possible to write code like the following. I'm trying to using
Moq with objects that I'm reflecting on as part of a testing
framework. The code below raises a "Unhandled expression type: 'Goto'"
exception from Moq, which I guess is expecting something different. It
kind of looks like it should work though!

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+";
}

Daniel Cazzulino

unread,
Sep 22, 2011, 10:46:28 AM9/22/11
to moq...@googlegroups.com
Expression.Return(Expression.Label(), 

that's wrong. you're not returning a label.

best way to go about this is to create the expression lambda with C# (v => v.Bar) and inspect the resulting expression tree. That's what you should be creating next with expression API. There won't be a label there for sure.

/kzu

--
Daniel Cazzulino | Developer Lead | XML MVP | Clarius Consulting | +1 425.329.3471


benny

unread,
Sep 27, 2011, 4:39:10 AM9/27/11
to Moq Discussions
Thanks, I like the idea of creating an expression lamba normally and
then inspecting the expression tree that gets created. I'll give it a
go.

benny

unread,
Oct 11, 2011, 8:25:24 AM10/11/11
to Moq Discussions
Ok, this is possible, here is the corrected code.

// 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+";

I investigated this by creating an expression from a lambda using the
code below

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

I then looked at this in the debugger in vs 2010. Expressions have a
"Debug View" that shows a text representation of the expression so it
is possible to add a watch on that or something similar. The above
comes out as

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

I looked at this and tried to work out what Expressions would make
this, then created an expression and compared it in the debugger.

The interesting thing for me is that although this expression returns
a value there is no assignment or return statement. I guess this must
be implicit somehow.
Reply all
Reply to author
Forward
0 new messages