Assert.AreNotEqual과 Assert.AreNotSame의 차이점은 무엇입니까?
C #에서 차이점은 무엇입니까
Assert.AreNotEqual
과
Assert.AreNotSame
여기에 제공된 거의 모든 답변이 정확하지만 예를 들어 볼 가치가 있습니다.
public static string GetSecondWord(string text)
{
// Yes, an appalling implementation...
return text.Split(' ')[1];
}
string expected = "world";
string actual = GetSecondWord("hello world");
// Good: the two strings should be *equal* as they have the same contents
Assert.AreEqual(expected, actual);
// Bad: the two string *references* won't be the same
Assert.AreSame(expected, actual);
AreNotEqual
그리고 AreNotSame
단지 반전있는 AreEqual
및 AreSame
과정은.
편집 : 현재 허용 된 답변에 대한 반박 ...
Assert.AreSame
값 유형과 함께 사용 하는 경우 상자로 표시됩니다. 즉, 다음을 수행하는 것과 동일합니다.
int firstNumber = 1;
int secondNumber = 1;
object boxedFirstNumber = firstNumber;
object boxedSecondNumber = secondNumber;
// There are overloads for AreEqual for various value types
// (assuming NUnit here)
Assert.AreEqual(firstNumber, secondNumber);
// ... but not for AreSame, as it's not intended for use with value types
Assert.AreSame(boxedFirstNumber, boxedSecondNumber);
값 유형 이므로 객체 값 도 firstNumber
없습니다 . 이유 .NET에서, 값을 권투하는 새로운 상자 각 시간을 만들기 때문에 호출이 실패 할 것입니다. (Java에서는 때때로 그렇지 않습니다. 이것은 전에 나를 잡았습니다.)secondNumber
int
AreSame
기본적으로 값 유형을 비교할 때 사용 해서는 안됩니다AreSame
. 참조 유형을 비교할 때 AreSame
동일한 참조를 확인하려면 사용 하십시오. AreEqual
에서 동등성을 확인 하는 데 사용 합니다 Equals
. 편집 : 거기에 참고하는 것이 있습니다 NUnit를 그냥 사용하지 않는 경우 Equals
직접적으로는; 컬렉션에 대한 기본 지원 기능이 있으며 컬렉션의 요소가 동일한 지 테스트됩니다.
답변의 주장 :
위의 예를 사용하여 int를 문자열로 변경하면 AreSame 및 AreEqual이 동일한 값을 반환합니다.
변수가 초기화되는 방식에 전적으로 의존합니다. 그들이 문자열 리터럴을 사용한다면 인턴이 그것을 처리 할 것입니다. 그러나 다음을 사용하는 경우 :
string firstString = 1.ToString();
string secondString = 1.ToString();
AreSame과 AreEqual은 거의 확실히 동일한 값을 반환 하지 않습니다 .
에 관해서 :
일반적으로 값 유형에는 AreEqual을 사용하고 참조 유형에는 AreSame을 사용합니다.
나는 거의 참조 신원을 확인하고 싶지 않습니다 . 나에게는 거의 유용하지 않습니다. 내가 확인하고 싶은 동등한 것입니다 AreEqual
수표. ( AreSame
그것이 있으면 안된다고 말하는 것이 아닙니다. 유용한 방법 AreEqual
입니다..)
두 가지가 동일 할 수 있지만 다른 대상입니다. AreNotEqual 은 같음 테스트를 통해 개체 값 을 확인하는 반면 AreNotSame은 동일한 개체가 아닌지 확인합니다.
It is obvious why we would want to test that things AreNotEqual (we care about the values being tested); what about AreNotSame? The usefulness of this in testing is found when you have passed references around and want to make sure that after your shuffling is done that two references are still the same object.
In a real world case, we use a lot of caching objects to mitigate round trips to the database. After an object has been handed off to the cache system, our unit tests ensure that in some cases we get back the same object (cache was valid) and in other cases we get back a fresh object (cache was invalidated). Note that AreNotEqual would not necessary suffice in this case. If the object had a new timestamp in the database, yet the data was not "different enough" to fail an equality test, AreNotEqual wouldn't notice that we refreshed the object.
AreNotSame does reference comparison, whereas AreNotEqual does an equality comparison.
Assert.AreNotEqual asserts that two values are not equal to each other.
Assert.AreNotSame asserts that two variables do not point to the same object.
Example 1:
int i = 1; int j = i; // The values are equal: Assert.AreEqual(i, j); // Two value types do *not* represent the same object: Assert.AreNotSame(i, j);
Example 2:
string s = "A"; string t = s; // The values are equal: Assert.AreEqual(s, t); // Reference types *can* point to the same object: Assert.AreSame(s, t);
AreNotSame uses reference equality (object.ReferenceEquals
) - i.e. are they the same actual instance of an object; AreNotEqual uses conceptual equality (.Equals
) - i.e. are they considered equal.
Isn't it so that AreNotEqual checks for the case where two objects are not equal in terms of Equals() method, whereas AreNotSame checks for the case where the two object references are not the same. So if x and y are two objects which are equal in terms of Equals() but have been separately allocated, AreNotEqual() would trigger failing assertion but the other not.
'IT박스' 카테고리의 다른 글
URL에 공백이 있습니까? (0) | 2020.12.01 |
---|---|
자바 : 특정 코드 블록에 시간 초과 설정? (0) | 2020.12.01 |
CSS는 개발 환경과 웹 서버에서 다르게 렌더링됩니다. (0) | 2020.11.30 |
WPF TextBox에 이벤트 붙여 넣기 (0) | 2020.11.30 |
Visual Studio 솔루션에서 모든 중단 점 지우기 (0) | 2020.11.30 |