2013-04-04 2 views
2

단위 테스트를 위해 주입 된 인터페이스가 있습니다. 문제의 메서드가 작동하지만 반환 된 샘플 데이터가 완전하고 정확하다는 것을 확인하는 단위 테스트를 작성하려고합니다. 내 테스트는 내게 맞는, 심지어 결과가 동일하게 보이지만 "CollectionAssert.AreEquivalent failed"로 테스트가 실패합니다. 예상 컬렉션에 1 번 발생했습니다. 실제 컬렉션에는 0 번 발생했습니다. " 객체의CollectionAssert.AreEquivalent failed ... 이유를 알아낼 수 없습니다.

[TestMethod] 
    public void Should_Get_All_Amenities() 
    { 
     var amenitiesRep = _ninjectKernel.Get<IAmenityRepository>(); 

     var amenities = amenitiesRep.GetAmenities(); 

     var expected = new List<Amenity> 
     { 
      new Amenity() {Id = 1, Name = "Pool", Category = "resort"}, 
      new Amenity() {Id = 2, Name = "Hottub", Category = "resort"}, 
      new Amenity() {Id = 3, Name = "Steamroom", Category = "unit"} 
     }; 

     Assert.IsNotNull(amenities); 
     Assert.IsTrue(amenities.Count() == 3); 
     CollectionAssert.AreEquivalent(expected, amenities); 
    } 

나는 CollectionAssert에 제대로 설치되어있는 모든 데이터를 확인하실 수 있습니다

 var amenities = new List<Amenity> 
     { 
      new Amenity() {Id = 1, Name = "Pool", Category = "resort"}, 
      new Amenity() {Id = 2, Name = "Hottub", Category = "resort"}, 
      new Amenity() {Id = 3, Name = "Steamroom", Category = "unit"} 
     }; 

     var mockAmenitiesRep = new Mock<IAmenityRepository>(); 
     mockAmenitiesRep.Setup(_m => _m.GetAmenities()).Returns(amenities); 
     Kernel.Bind<IAmenityRepository>().ToConstant(mockAmenitiesRep.Object); 

(내 TestRepository에서 관련 코드), 모든 필드가 1로 1 일치하도록 표시, 같은 번호, 같은 객체 유형이 없으므로 테스트가 실패한 이유를 놓쳤습니다.

(편집 : 라인의 코드가 실패 CollectionAssert입니다)

+3

Amenity.Equals 메소드는 어떤 모습입니까? –

+0

Amenity.Equals 메소드를 지정하지 않았습니다. (나는 하나의 예를 보지 못했지만이 단위 테스트 형식을 구현하는 데있어서 실제로 좋은 가이드를 찾지 못했습니다. 그래서 제가 필요하지 않다는 것을 알았습니다.) – RualStorge

답변

7

CollectionAssert.AreEquivalent가 참조 된 주소로 평등을 확인 있도록 편의 시설 참조 형식입니다 때문입니다. 예상 컬렉션의 항목은 GetAmenities() 메서드에서 가져온 것과 다른 개체이므로 false를 반환합니다. 어 메 니티 클래스에서 동등 비교자를 대체해야합니다.

public override bool Equals(object obj) 
{ 
    var other = obj as Amenity; 
    if(other == null) 
    { 
     return false; 
    } 

    return Id = other.Id && Name == other.Name && Category == other.Category; 
} 

public override int GetHashCode() 
{ 
    return Id.GetHashCode(); //assumes Id is immutable 
} 

업데이트 :이 Equality Pollution로 연결하기 때문에

이 방법은 매우 좋지 않다 명심하십시오. Alexander Stepaniuk은 의견에 더 나은 대안을 게시했습니다.

+0

감사합니다. 이것을 시도하고 무슨 일이 일어나는지 알려주십시오. – RualStorge

+0

작동합니다. 감사합니다. – RualStorge

+1

사용자 정의 항목 비교자를 사용하여 동등 함의 컬렉션을 선언 할 수도 있습니다. 따라서, 테스트 목적으로'Equals'을 구현할 필요가 없습니다. [here] (http://nunit.org/index.php?p=collectionConstraints&r=2.5.10)를 참조하십시오. 'Is.Equivalent'와'Using' 한정자를 사용할 수 있습니다. –

관련 문제