2010-06-17 2 views
7

예외적으로 무거워 보이지만 규칙에 따라 변경하려면 공개적으로 사용 가능한 모든 항목을 테스트해야합니다.auto-implemented properties을 테스트해야합니까?단위 테스트에서 자동 구현 된 속성 값이 있습니까

public class Customer 
{ 
    public string EmailAddr { get; set; } 
} 

는 당신이 API는 속성의 예상 집합을 준수 함을 테스트하는 경우가 달려

[TestClass] 
public class CustomerTests : TestClassBase 
{ 
    [TestMethod] 
    public void CanSetCustomerEmailAddress() 
    { 
     //Arrange 
     Customer customer = new Customer(); 

     //Act 
     customer.EmailAddr = "[email protected]"; 

     //Assert 
     Assert.AreEqual("[email protected]", customer.EmailAddr); 
    } 
} 

답변

7

자동 구현 속성에서 완전히 다른 속성으로 전환하면 어떻게됩니까? 테스트는 테스트를 작성할 때 고려해서는 안되는 구현을 알고 있기 때문에 중복되는 것처럼 보입니다.

물론 이것은 실제로 구현을 실제로 변경할 가능성에 달려 있습니다.

+4

그런 일이 생기면, 테스트를 먼저 작성하면됩니다. 그러면 테스트 될 것입니다. 적어도 TDD를한다면 그것이 작동 할 수있는 방법이 될 것입니다. 우리 모두는 사람들이 항상 자신의 테스트를 먼저 쓰는 것은 아니라는 것을 알고 있습니다. 회귀 측면에 대해서는 – ckramer

+1

+1. 오늘은 자동 속성입니다.하지만 내일은 새로운 클래스 기능 등을 지원하기 위해 수정이 필요할 수 있습니다. –

1

에 의해 테스트 된 고객 클래스, 또는 설명으로, 경우 , 당신은 단지 속성에 접근하고 설정하는 것을 테스트하는 것입니다.

예를 들면 나는 아니오라고 말하고 싶습니다. 예상 API에 부합

업데이트

; 간접적으로 속성에 액세스하는 경우 반사/동적 환경에서 말하고 속성 및 메서드 액세스 호출을 사용하여 알 수없는 API가 예상 한 것과 일치하는지 확인합니다.

+0

"API가 예상되는 속성 집합을 준수하는지 테스트하는"의미에 대해 자세히 설명 할 수 있습니까? – ahsteele

10

나는 일반적으로 테스트를 수행 할 가치가없는 행동을 수행하지 않는 코드를 고려합니다. 이것은 일반적으로 값을 설정하거나 반환하기 때문에 속성을 테스트하지 않습니다 (자동 구현 여부).

속성의 getter 또는 setter가 다른 필드/속성/상태에 따라 두 개 이상의 값 중 하나를 반환하는 것과 같이 일종의 "작업"을 수행하는 경우이 값이 변경됩니다.

본 적이 없으면 Roy Osherove'sbook on Unit Testing을 적극 권장합니다. 이 프로그램은 모든 종류의 "테스트 할 대상과 시간"질문을 ​​포함하여이 질문을 포함합니다.

+1

자동 속성 테스트는 코드가 아니라 프레임 워크를 테스트하고 있습니다. 확인할 코드 로직이 없습니다. 그리고 프로퍼티 뒤에 코드를 추가하면 결국 테스트 커버리지가 내려 가서 해당 프로퍼티를 테스트 할 시간이되었음을 알 수 있습니다. – Mathias

+0

테스트 커버리지를 보는 것보다 훨씬 간단합니다 ... 다른 응답에서 주석을 달았으므로 코드를 변경하여 자동 속성 이외의 다른 작업을 수행하면 테스트에 의해 변경되어야하므로 이 시점에서 기능의 변화를 시험해보십시오. – ckramer

0

단위 테스트는 응용 프로그램에서 구현하는 테스트 기능에만 국한되어야합니다.

응용 프로그램이 의존하는 API/SDK를 테스트해서는 안됩니다. 부분적으로 시간 낭비 (회사에서 X-Third-Party SDK/API를 테스트하기 위해 비용을 지불하기를 원하는가?)와 부분적으로 유닛 테스트 스위트에 "노이즈"가 발생하기 때문입니다. 단위 테스트 라이브러리의 컨텍스트는 응용 프로그램의 코드 만 테스트하는 것입니다.

+0

'고객 '은 우리가 소유 한 클래스입니다. – ahsteele

+0

@ahsteele,하지만 사실은 테스트는 틀림없이 C# 컴파일러의 동작 만 테스트합니다. – Yishai

+0

@ Yishai가 동의했다. 대답을 다시 읽으면서 나는 warriorpostman이 몰고있는 것을 본다. – ahsteele

1

테스트 설정 및 속성 가져 오기는 개체의 비즈니스 기능 테스트 컨텍스트에서 수행해야합니다. 속성을 테스트하는 비즈니스 기능이 없으면 속성이 필요 없거나 더 많은 테스트가 필요합니다. 나는 당신이 어떤 테스트를 작성하기 전에 그것들을 추가하기보다는 그것들을 필요로하는 테스트를 추가 할 때 당신이 프로퍼티를 추가 할 것을 제안한다.

비즈니스 기능을 테스트하면 코드를 단위 테스트의 관점에서 훨씬 더 많은 블랙 박스로 처리하게됩니다. 이를 통해 테스트에 미치는 영향을 최소화하면서 구현 세부 사항을 전환 할 수 있습니다.Refactor는 TDD주기의 중요한 (종종 간과 된) 단계이기 때문에 코드 편집이 훨씬 적습니다. 또한 예를 들어 속성에 공용 설정자가 없어야하며 유효성 검사 및 기타 비즈니스 논리를 수행하는 메서드로 할당해야 함을 알 수 있습니다.

관련 문제