2011-09-07 2 views
3

다음과 같은 코드를 작성할 수 있습니까? 내가 테스트 프레임 워크의 일부로 반영하고있는 객체에 Moq을 사용하려고합니다. 아래의 코드는 "처리되지 않은 표현 유형 : Moq의 'Goto'예외를 발생시킵니다. 이것은 뭔가 다른 것을 기대합니다. 비록 그것이 작동해야하는 것처럼 보이는 종류의!동적으로 생성 된 표현 트리/람다를 moq에 전달하는 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+"; 
    } 

고마워요!

답변

4

이 코드는 수정 가능합니다.

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

나는 그때 2010 년 식 대에 디버거에서이 바라 보았다

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

아래의 코드를 사용하여 람다에서 식을 작성하여이를 표시하는 "디버그보기"한 조사 표현의 텍스트 표현이 가능하므로 시계를 추가 할 수 있습니다. 위의 내가이 쳐다 보면서 표현이를 만들 것입니다 무엇을 해결하려고

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

으로 나오고, 다음 식을 생성하고 디버거에 비교했다.

저에게 흥미로운 점은이 표현식은 값을 반환하지만 할당이나 반환 문이 없다는 것입니다. 어떻게 든 암묵적이어야합니다.