c# unittest -assert.areequal ()은 인수가 null 인 경우 동등하게 호출하지 않습니다.

StackOverflow https://stackoverflow.com/questions/460371

문제

나는 최근에 Google이 완전히 설명하지 못한 겉보기에 이상한 행동을 우연히 발견했습니다.


using Microsoft.VisualStudio.TestTools.UnitTesting;

class TestClass
{
    public override bool Equals(object obj)
    {
        return true;
    }
}

[TestMethod]
public void TestMethod1()
{
    TestClass t = new TestClass ();
    Assert.AreEqual (t, null); // fails
    Assert.IsTrue (t.Equals (null)); // passes
}

이 테스트가 성공할 것으로 기대합니다. 그러나 Visual Studio 2008 / .NET 3.5에서는 실패합니다. 그것은 그런 것 같습니까 아니면 버그입니까?

도움이 되었습니까?

해결책

TestClass는 계약을 위반합니다 Object.Equals. Assert.AreEqual 그 계약에 상당히 합리적으로 의존하고 있습니다.

DOCS 상태 (요구 사항 목록) :

  • x.equals (null 참조 (Visual Basic에서는 없음))는 false를 반환합니다.

다른 팁

널 테스트 할 때는 사용하지 마십시오 Assert.AreEqual.

당신은 사용해야합니다 Assert.IsNull() 그에 대한.

첫 번째 테스트가 실패합니다. "T"가 NULL인지 테스트하지는 않습니다. 새로운 TestClass 객체로 T를 초기화했기 때문입니다.

T.Equals는 항상 True를 반환하기 때문에 두 번째 테스트는 통과합니다.

하나의 테스트가 실패하면 전체 testmethod1이 실패한 것으로 표시됩니다.

아니요, 맞습니다. t testclass 객체에 t를 초기화했습니다.

내가 당신을 올바르게 얻는다면, 그것은 실제로 AreEqual(anythingButNull, null) 항상 거짓을 반환합니까?

(편집) 내가 궁금한 이유는 평등의 계약에 따라 NULL에 대한 테스트가 클래스를 유닛 테스트 할 때 호출되지 않기 때문입니다. 따라서 Areequal은 계약에 의존하기 때문에 내 클래스가 계약을 준수하는지 확인하지 못합니다. 그래서 나는 해결 방법을 사용해야한다고 생각합니다. Assert.IsFalse(blah.Equals(null)).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top