2009-11-30 5 views
4

단락 것을 테스트합니다. 적어도 내가 얻는 새로운 표현이 작동하도록.어떻게 표현 나는 다음과 같은 서명이 확장 방법이

이제는 메서드가 and의 단락 버전을 사용하는지 확인하는 또 다른 테스트 케이스를 작성하려고합니다. 어떻게 이걸 할 수 있는지 어떤 단서?

는 난 그냥 같은 것을 할 수 있다고 생각 :

[Test] 
    public void And_PredicatesAreShortCircuited() 
    { 
     var predicateNotUsed = true; 
     Expression<Func<int, bool>> a = x => false; 
     Expression<Func<int, bool>> b = x => 
      { 
       predicateNotUsed = false; 
       return true; 
      }; 

     var foo = new[] { 1, 2, 3, 4, 5, 6, 7 } 
      .Where(a.And(b).Compile()) 
      .ToArray(); 

     Assert.That(predicateNotUsed); 
    } 

을하지만 문장 몸 "람다 표현식으로 변환 할 수 없다는 b 동안 그 전체 문장의 몸에서 구불 구불 한 거대한 붉은 얻을 표현 트리 ". 그래서 ... 어떤 선택권이라도? 아니면 쓸 수없는 시험입니까?

+2

거기에는 혼란 스러움과 거짓이 있습니다. –

+0

Wops. 나는 지금 당장 그것을 얻을 수 있었다고 생각합니다. : p – Svish

+0

오류에 대한 간단한 설명. 단일 라인 λ 식 또는 식 lambdas ("a"case)와 식 트리 사이의 암시적인 변환이 있지만 여러 줄의 람다 식 또는 문 람다 ("b"대)와 식 트리 간의 암시 적 변환은 없습니다 . 자세한 내용은 http://blogs.msdn.com/csharpfaq/archive/2009/09/14/generating-dynamic-methods-with-expression-trees-in-visual-studio-2010.aspx –

답변

8

간단한 제안 : 값 유형 대신 참조 유형을 사용하고 따르지 않으려는 경로에서 참조를 취소하십시오. null을 전달하고, 예외를 :) 발생 여부를 확인

[Test] 
public void And_PredicatesAreShortCircuited() 
{ 
    Expression<Func<string, bool>> a = x => false; 
    Expression<Func<string, bool>> b = x => x.Length > 10; 

    var foo = new[] { null, null } 
     .Where(a.And(b).Compile()) 
     .ToArray(); 
} 

또 다른 대안은 (예를 들어 식 트리에 의해 변경 될 수있는 무언가를 전달) 입력 데이터에 대한 몇 가지 측면 초래 기능을 사용하는 것입니다하지만, 그런 다음

public T NonVoidFail(T x) 
{ 
    Assert.Fail("I shouldn't be called"); 
    return x; // Will never happen 
} 

:

[Test] 
public void And_PredicatesAreShortCircuited() 
{ 
    Expression<Func<int, bool>> a = x => false; 
    Expression<Func<int, bool>> b = x => NonVoidFail(x); 

    var foo = new[] { 1, 2, 3, 4, 5, 6, 7 } 
     .Where(a.And(b).Compile()) 
     .ToArray(); 
} 
01 나는 위의 아마 가장 간단한 방법 :

또는 다른 생각이있을 것이라고 생각

같은 원칙이지만 더 좋은 예외를 줄 것입니다.

+1

을 참조하십시오. 너는 이걸로 생각 해낸다 ...? : p - 고마워! :디 – Svish

관련 문제