2016-07-14 3 views
4

개체를 DTO로 받고 프로젝트를 View-Models로 변환하는 프로젝트가 있습니다. 이 변환을 수행하기 위해 DTO 속성에서보기 - 모델로 변환하기 위해 일부 계산을 수행하는 사용자 지정 변환기를 만들기로 결정했습니다. 이 모든 것들이 준비되고 변환이 작동하면, 좀 더 안정적으로 만들기 위해 단위 테스트를 변환에 추가하고 싶습니다 (TDD를 존중하지 않는다는 것을 알고 있지만 이것이 내가 할 수 있었던 것입니다). 내가보기 - 모델 중 어느 것도 Equals 메소드를 정의하지 않기 때문에이보기-모델 단위 테스트에서 두 객체의 동등성을 테스트하는 방법은 무엇입니까?

Assert.AreEqual(expected, actual); 

의 평등을 확인하는 테스트를 할 때

문제

온다, 그들은 참고로 동일하지 않습니다.

  1. Equals 방법을 정의하려면 : 내가 생각하고 이러한 개체를 비교하는 것으로 몇 가지 방법이 있습니다. 그러나 테스트 목적으로 만 정의하는 것이 좋은 실행인지 여부는 알 수 없습니다. 그리고 정의한다면, GetHashCode 메서드를 정의하는 것이 좋습니다. 따라서이 솔루션이 최고라고 느끼지 않습니다.

  2. 또 다른 가능성은 테스트 프로젝트에서 IEqualityComparer<T>을 구현하거나 주 변환 프로젝트에서 비교 논리를 분리하거나이를 3 번째 프로젝트로 추출하여 향후 변환 모듈에서 필요할 경우 사용할 수 있다는 것입니다. . 이 구현은 훌륭하게 보이지만 많은 클래스가있는 다른 프로젝트를 추가 할 가치가 있는지는 알지 못합니다. 테스트해야합니다.

  3. 흥미로운 것으로 보이는 Stack Overflow question에있는 세 번째 방법은 두 개체를 직렬화하고 문자열을 비교하는 것입니다. 문제는 이것이 프로그래밍의 좋은 습관인지 나는 모른다.

다음 중 오브젝트를 비교하는 가장 좋은 방법은? 좀 더 효율적으로 접근 할 수있는 몇 가지 접근법을 놓치고 있습니까?

참고 : View-Models는 복잡한 개체이므로 다른 기술로의 변환 방법을 변경할 수 없습니다.

+0

당신이 이미 장단점을 설명한 것처럼 보입니다. 동일한 유형이 아니라면 직렬화를 신뢰하지 않을 것입니다. 동일한 속성을 가진 두 가지 유형이 다르게 직렬화 될 수있는 많은 이유가 있습니다. –

+0

@DStanley @DStanley 그들은 언제나 같은 타입이 될 것입니다. 그렇기 때문에 일반적인 타입 파라미터를 가진 메소드를 만들고 있는데, 두 객체 모두를받는 'IEqualityComparer'에서 'Equals'를 사용하고 간단한 비교 대신에 그들을 직렬화하고 그들의 문자열 비교를 반환? 이 방법으로 충분히 안정적일까요? – meJustAndrew

+0

@D 스텐리 나는 너무 광범위하다는 질문에 답을 얻으 려구요. 너무 광범위하다는 것을 의미하는 도움말 센터를 읽었습니다.이 질문은 해당 섹션에 맞지 않다고 대답하지 않습니다. 책의 구멍 내용물을 망가 뜨리거나 정말로 길게 답변하지 않아도됩니다. 많은 다른 프로그래밍 질문에 여러 가지 답변을 드릴 수는 있지만 좋지는 않지만 * 너무 광범위하다고 생각하십시오. 고맙습니다! – meJustAndrew

답변

2

두 번째 접근 방식은 다른 두 사람보다 훨씬 더, 그것은과 함께 테스트 - 특정 코드를 유지하기 때문에 단위 테스트 및 두 개의 View-Models가 동일하다는 것을 정의하는 것을 변경할 수 있기 때문입니다.

평등 비교자를 별도의 프로젝트로 옮기는 것은 거의 가치가 없습니다. 평등 비교 논리를 공유하려는 경우에는 객체에 넣을 수도 있습니다. 반면에 테스트 용으로 만 설계된 경우 테스트와 함께 유지해야합니다 (예 : 접근 방식 1 사용).

직렬화를 기반으로 한 접근법은 관련성이없는 기능 (예 :직렬화)를 사용하여 실제로 테스트하고있는 기능 (예 : 변환)을 테스트합니다.

3

저는 Fluent Assertions의 ShouldBeEquivalentTo 메소드를 정말 좋아합니다. 기본적으로

actual.ShouldBeEquivalentTo(expected); 

, 이것은 당신이 구조적으로 동일에 전달하는 객체 모두를 가정하여, "바로 작동",하지만 당신은 당신이 비교를 수행하는 방법을 사용자 정의하는 추가 인수를 제공 할 수 있습니다. 당신은 단지 개체의 몇 가지의 동등성을 확인하려는 경우 예를 들어, 당신은 말할 수 :

actual.ShouldBeEquivalentTo(new { 
    expected.Name, 
    expected.Description, 
    expected.Code 
}, options => 
    options.ExcludingMissingMembers); 
관련 문제