2012-02-03 1 views
4

IEnumerable <SelectListItem>과 같은 옵션 목록을 포함하는보기 모델을 생성하는 컨트롤러에 대한 단위 테스트를 작성하는 중입니다. 예상 된 목록에 뷰 모델의 모든 항목이 포함되어 있는지 확인하고 그 반대의 경우도 확인했습니다. 놀랍게도 이것은 항상 거짓입니다. 그래서 다음 테스트를 만들었습니다 :MVC SelectListItem이 같지 않음을 구현합니까?

[TestMethod] 
public void CanEqual() 
{ 
    var x = new SelectListItem {Selected = false, Text = "A", Value = "A"}; 
    var y = new SelectListItem { Selected = false, Text = "A", Value = "A" }; 
    Assert.AreEqual(x, y); 
} 

어설 션은 항상 실패하지만 둘은 동일합니다. SelectListItem이 실제로 Equals를 구현하지 않습니까? 아니면 여기에 뭔가가 누락되어 있습니까?

답변

2

- 당신은 을 할 경우, 당신이 정말로 그 일을보다 ... 어쨌든 ...) 다른 GetHashCode()를 오버라이드 (override) 할 필요가, 당신은 할 수 :

  1. 이 값 비교를 할 수있는 테스트 프로젝트에서 도우미 메서드를 만듭니다 (그것은 일반적으로 작성 가능 대부분의 간단한 클래스에서 작동하는 리플렉션을 사용하는 다목적 클래스) 또는
  2. 헬퍼 cl 만들기 엉덩이 IEqualityComparer<T> 각 유형을 비교할 필요가 구현합니다.

도 사용할 수 없지만 일반적으로 테스팅을 허용하기 위해 개체에 코드를 추가하는 대신 테스트 프로젝트에서 코드를 유지하는 것이 좋습니다. 또한 이러한 접근 방식을 사용하면 GetHashCode() 등을 구현할 필요가 없습니다.

2

기본적으로 동일한 참조를 테스트하기 때문입니다. 이 경우 객체의 인스턴스가 두 개이므로 "동일하지"않습니다.

해당 동작을 변경하려면 IEquatable<T> 인터페이스를 구현하기 만하면 Equals()이 반환 할 것을 다시 정의 할 수 있습니다. 예를 들어 : Object.Equals()에 좋은 참고로

public bool Equals(YourClass other) 
{ 
    return (this.Value == other.Value); 
} 

, this MSDN reference를 참조하십시오. 참조 유형에 대한 평등은 해당 참조를 기반으로합니다. 나는. 동일한 객체를 참조하지 않으면 Equals()false을 반환합니다. (당신이 그렇게한다면, 당신은 정말 너무 제네릭이 아닌 Equals()를 오버라이드 (override) 할 필요가 파생 클래스에 IEquatable<T>를 구현하는 것보다 다른, 그것에 대해 무엇을해야할지에 관해서는 ... 상어의 대답에 추가

+0

GrantVS는 "맞음"입니다. SelectListItem은 실제로 자체 Equals를 구현하지 않습니다. 사실 SelectListItem 구현은 자동 구현 된 세 가지 속성 중 하나입니다. 상어의 대답은 (언제나 그렇듯이) 이미 완벽하기 때문에 여기에 추가하십시오. – JimmiTh

+0

SelectListItem에서 제공하는 Equals 메서드는 참조를 확인합니다 (== 연산자가 그렇게 할 것으로 예상 했음). 두 인스턴스를 비교할 수 있도록 확장해야합니까? – GrantVS

+1

@GrantVS : 일부 대안에 대한 답변을 추가했습니다. 하지만 그렇습니다.'=='는 보통 Equals()가 오버라이드 된 경우에도 참조 유형에 대한 ID를 비교할 것입니다. 그러나이 경우에 둘 다 정체성을 비교합니다. 왜냐하면 두 객체가 모두 '객체'에서 곧바로 상속되기 때문입니다. – JimmiTh