2012-10-08 2 views
2

Func의 항등 비교는 어떻게 작동합니까? 나는이 단위 테스트에 내 문제의 복잡성을 감소 :함수 NUnit 항등 비교

[Test] 
public void Will_Pass() 
{ 
    Func<string> func =() => "key"; 
    Assert.That(func, Is.EqualTo(func)); 
} 

[Test] 
public void Will_Fail() 
{ 
    Func<string> funcA =() => "key"; 
    Func<string> funcB =() => "key"; 
    Assert.That(funcA, Is.EqualTo(funcB)); 
} 

나는 테스트해야 - 주장 성공적으로 - Func의 인스턴스가 다른 인스턴스와 동일한 것이다. 따라서 기본적으로 Failing 테스트를 통과하는 방법이 필요합니다.

사용자 지정 유형을 만들고 Equals()을 무시하지 않고이 작업을 수행 할 수있는 방법이 있습니까?

+0

아마도 'Func '대신 표현식 트리를 사용하면 더 쉬울 것입니다. – Oded

+1

[ExpressionEqualityComparer.cs] (https://source.db4o.com/db4o/trunk/db4o.net/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/)를 참조하십시오. –

+0

@ L.B thanks; 표현 방식에는 가치가 있지만 John이 권장하는대로 테스트 결과를 테스트 할 것입니다. – Nick

답변

5

실패한 테스트 은 (가)이 아닙니다. 적어도 현재의 Microsoft C# 컴파일러 구현과 관련해서는 .NET과 관련된 모든 기능이 동일하지 않습니다. 위임자는 별도로 생성 된 메소드를 참조합니다 (일리노이를 통해 쉽게 확인할 수 있습니다). 언어 사양 을 사용하면이 동일하지만 허용 할 필요가 없으며이를 수행 할 구현을 알지 못합니다.

는 명 규모의

평등 비교는 기본적으로 (하나의 액션 위임의 경우)로 구성 :

  • 가 대표를 수행은 같은 방법을 참조하십시오?
  • 대리인의 대상이있는 경우 대상이 동일합니까?

첫 번째 조건은 테스트에서 거짓입니다.

+0

그래서 함수를 두 번 선언하면 같은 것을 제외하고 각각에 대해 하나의 메소드가 생성됩니다 (고유 한 이름은 아마도?). 나는 실패한 테스트에서 새로운'func'을 초기화하고 새로운'func'을'funcA'와'funcB'에 할당함으로써 이것을 증명할 수 있습니다. 그런 다음 테스트가 통과됩니다. 질문의 이유는 내가 검증 할 필요가있는 하드 코딩 된 인라인 함수가 있다는 것입니다. 이들에 대한 주장을하기 위해이 func을 전 세계적으로 접근 가능하게 만드는 것을 권유하겠습니까? – Nick

+0

@ 닉 (Nick) : 나는 똑같은 기능이 사용된다는 것을 테스트하기보다는 그 기능의 사용법이 올바른 일을하는지 테스트 할 것이다. –