NUnit의 Assert.Equals에서 예외가 발생합니다. "Assert.Equals는 어설 션에 사용하면 안됩니다"


132

최근에 새로운 NUnit 테스트를 작성할 때 Assert.Equals () 메소드를 사용하려고 시도했습니다. 실행 시이 메소드는 이것이 언뜻보기에 조금 당황 스럽다는 AssertionException진술을 던집니다 Assert.Equals should not be used for Assertions.. 무슨 일이야?


이것이 포함 된 특정 코드와 같은 컨텍스트를 알려주시겠습니까? 어떤 유형의 객체 등을 비교 했습니까?
Mike Parkhill

9
죄송하지만 이미 이것에 대한 답을 찾았습니다. 방금 후손에 대한 답변을 게시 할 수 있도록 요청했습니다. 답을 읽으면 컨텍스트가 중요하지 않습니다. 예외 메시지에서 웹 검색을 통해이 답변을 쉽게 찾을 수 있기를 바랍니다.
Odrade

답변:


201

Assert모든 클래스가 C #에서 암시 적으로 수행하므로 System.Object에서 상속되는 정적 클래스입니다. System.Object는 다음 방법을 구현합니다.

static bool Equals(object a, object b)

평등 비교를위한 Assert의 Assert.AreEqual()방법이 있습니다. 따라서 Object.Equals()단위 테스트에서 Assert 클래스를 통해 메소드를 호출 하는 것은 실수입니다. 이러한 실수를 방지하고 혼동을 피하기 위해 NUnit 개발자 Object.Equals는 예외를 발생시키는 구현으로 Assert 클래스에 의도적으로 숨겨져 있습니다. 구현은 다음과 같습니다.

/// <summary>
 /// The Equals method throws an AssertionException. This is done
 /// to make sure there is no mistake by calling this function.
 /// </summary>
 /// <param name="a"></param>
 /// <param name="b"></param>
 [EditorBrowsable(EditorBrowsableState.Never)]
 public static new bool Equals(object a, object b)
 {
     // TODO: This should probably be InvalidOperationException
     throw new AssertionException("Assert.Equals should not be used for Assertions");
 }

물론 예외 메시지 자체는 혼란 스럽지만 적어도 뭔가 잘못한 것을 알려 줍니다.


13
메시지가 혼란 스럽지만 Google에 메시지를 입력하면이 답변에서 바로 끝나고 모든 것이 잘됩니다. 감사합니다.
Stephen Holt

25
NUnit 개발자는 "... Assert.AreEqual ()"을 사용하도록 메시지를 변경할 수 있습니다.
WillC

왜 그들은 대신 Equals 메소드를 비공개로 만들지 않았습니까?
shytikov 2016 년

4
@shytikov 불가능하기 때문에. 기본 클래스의 가상 메소드를 개인 클래스로 대체 할 수 없습니다.
Odrade

18

tldr;

Assert.AreEqual(a, b); // <-- Compares a, b

아니:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.