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'를 반환합니다. 물론 이것은 실제로 어설 션을 실패한 것과 아무런 관련이 없기 때문에 테스트 은으로 전달됩니다. 놀랄 만한.
제임스.
나는이 어리석은 실수로 방금 맞았습니다. 그것은 쉬운 함정에 빠지기 쉽습니다. 실제 Assertion이 호출되지 않으면 유닛 테스트 클래스가 적어도 경고를 던질 수있는 것처럼 보입니다. 적어도 위의 예제 코드와 내가 성취하려고했던 특정 속성 확인과 같은 매우 간단한 경우를 잡을 것입니다. –
"유닛 테스트 클래스는 실제 어서션이 호출되지 않으면 경고를 던질 수 있습니다." <-이 바보 같은 함정을 막는 것뿐만 아니라 꽤 재미있는 생각입니다. 나는 그것을 좋아한다. –
더 나은 생각은 Assert 클래스가 'ReferenceEquals'라는 새로운 정적 메서드를 만들어 'Object.ReferenceEquals'메서드를 섀도우하게 한 다음 해당 메서드를 적절한 오류 메시지가있는 ObsoleteAttribute로 표시하는 것입니다. 이런 식으로 사용자가 실수를했다면 경고를 받게됩니다. –