2009-04-19 5 views
22

Visual Studio Professonal 2008의 테스트 기능에서 처음 실패한 단위 테스트를 만들려고 시도 할 때 Assert.ReferenceEquals()을 얻지 못했습니다. 객체 인스턴스가 이 아니고이 아닌 경우 null 참조와 동일합니다. object.ReferenceEquals()은 동일한 비교를 위해 false을 올바르게 반환합니다. static object TheObject 속성이 결코 있도록 static void Startup(object) 방법은 비어 있음을Assert.ReferenceEquals() Visual Studio Test에서 Object.ReferenceEquals()가 'false'를 반환하는 패스

[TestClass()] 
public class ProjectTest 
{ 
    [TestMethod()] 
    public void StartupTest() 
    { 
     object obj = "hello"; 
     Project.Startup(obj);  
     Assert.ReferenceEquals(obj, Project.TheObject); // Test Passes!?! 
    } 
} 

참고 :

public static class Project 
{ 
    public static object TheObject { get; set; } 

    public static void Startup(object theObject) 
    { 
     // ToDo: Project.Startup(): Test. 
     // ToDo: Project.Startup(): Implement. 
    } 
} 

그리고 여기 내 테스트 클래스의 주요 측면은 다음과 같습니다

내 클래스 코드 설정되어 남아 있습니다 null. 따라서 분명히 Assert.ReferenceEquals(obj, Project.TheObject)이 실패해야하지만 어떻게 든이 테스트가 통과합니다. 올바르게

Assert.IsTrue(object.ReferenceEquals(obj, Project.TheObject))

원인이 시험

Assert.ReferenceEquals(obj, Project.TheObject)

변경

참고 못한다.

이것은 너무 단순 해 보이지만 여기서는 잘못된 점을 볼 수 없습니다. 누군가 내 방식으로 오류를 지적 할 수 있다면, 나는 많은 의무를지게 될 것이다. 사전에

감사합니다,

마이크 제임스 에이버리 응답

업데이트 :

아, 내가 지금 기분 바보. 나는 을 알고 있었는데과 같은 것이 었습니다. 와우. 물론 충분히

는 'GoToDefinition가'나를 소요 'Object.ReferenceEquals()'. 그래서 "Assert.ReferenceEquals()"를 입력하면 실제로 System.Object.ReferenceEquals()가되며, 제 경우에는 조용히 'false'를 반환합니다. 물론 이것은 실제로 어설 션을 실패한 것과 아무런 관련이 없기 때문에 테스트 으로 전달됩니다. 놀랄 만한.

제임스.

+0

나는이 어리석은 실수로 방금 맞았습니다. 그것은 쉬운 함정에 빠지기 쉽습니다. 실제 Assertion이 호출되지 않으면 유닛 테스트 클래스가 적어도 경고를 던질 수있는 것처럼 보입니다. 적어도 위의 예제 코드와 내가 성취하려고했던 특정 속성 확인과 같은 매우 간단한 경우를 잡을 것입니다. –

+0

"유닛 테스트 클래스는 실제 어서션이 호출되지 않으면 경고를 던질 수 있습니다." <-이 바보 같은 함정을 막는 것뿐만 아니라 꽤 재미있는 생각입니다. 나는 그것을 좋아한다. –

+2

더 나은 생각은 Assert 클래스가 'ReferenceEquals'라는 새로운 정적 메서드를 만들어 'Object.ReferenceEquals'메서드를 섀도우하게 한 다음 해당 메서드를 적절한 오류 메시지가있는 ObsoleteAttribute로 표시하는 것입니다. 이런 식으로 사용자가 실수를했다면 경고를 받게됩니다. –

답변

30

호출중인 ReferenceEquals 메서드는 모든 참조 개체에서 사용할 수있는 정적 메서드이며 테스트 프레임 워크의 일부가 아닙니다. 보시다시피 부울 값을 반환하는 반면 정상적인 어설 션은 무효화됩니다. 이것은 분명히 혼란 스럽습니다 .AreSame()은 당신이 찾고있는 주장입니다.

+1

아, 지금 바보 같아. 나는 * 이런 것이 있어야한다는 것을 알았다. 와우. 물론, 'GoToDefinition'은 나를 'Object.ReferenceEquals()'로 안내합니다. 그래서 "Assert.ReferenceEquals()"를 입력하면 실제로는 Object.ReferenceEquals()입니다.이 경우 제 경우에는 조용히 'false'를 반환합니다. 물론 실제로는 어설 션과 관련이 없습니다. 따라서 ** ** 시험은 통과합니다. 놀랄 만한. 감사합니다 제임스. –

+1

비슷한 문제가 발생하여 NUnit은 어설 션을 위해 ReferenceEquals를 사용하지 않는다는 예외를 던집니다. Assert.AreSame()으로 변경했습니다. 분명히 Assert.ReferenceEquals()는 예외를 던지려고하지만 우리가 기대하는 것을 수행하는 함수를 오버라이드하지 않는 것이 좋습니다. –