2010-04-15 3 views
5

나는 조롱하거나 테스트하고 테스트 할 때 어떤 수준으로 가야하는지 알고 싶다. 예를 들어, 내 코드에서 다음 개체가 있습니다.poco 개체에 대한 테스트를 만드는 방법

public class RuleViolation 
{ 
    public string ErrorMessage { get; private set; } 
    public string PropertyName { get; private set; } 

    public RuleViolation(string errorMessage) 
    { 
     ErrorMessage = errorMessage; 
    } 

    public RuleViolation(string errorMessage, string propertyName) 
    { 
     ErrorMessage = errorMessage; 
     PropertyName = propertyName; 
    } 
} 

이것은 비교적 간단한 개체입니다. 그래서 내 질문은 :

단위 테스트가 필요합니까?

내가 무엇을 테스트하고 어떻게합니까?

감사

+0

는 세터 개인 있는지 확인 할 방법에 대한 내 업데이 트를 참조하십시오. – kemiller2002

답변

4

나는 아마 말할 것 테스트가 없습니다. 이 클래스 외부의 코드에서 내가 시도 할 수있는 유일한 일이 될 수도가 수정할 수없는 정말 정말 중요하다면

public string ErrorMessage { get; private set; } 
public string PropertyName { get; private set; } 

: 그것은 매우 중요합니다 경우 당신은 아마 확인하려는 것이다 유일한 것은 액세스 한정자입니다 확인하십시오. 당신이 볼 수있는 property.GetAccessors();

class Program 
    { 
     static void Main(string[] args) 
     { 
      var property = typeof(Test).GetProperty("Accessor"); 

      var methods = property.GetAccessors(); 
     } 
    } 



    public class Test 
    { 
     public string Accessor 
     { 

      get; 
      private set; 
     }  

    } 

을 세터가있는 경우 : 여기

는 속성에 접근을 얻을 수있는 방법이다. 그렇다면 설정자는 공개입니다. IsPrivate 및 IsPublic 속성을 사용하여 다른 접근 자의 확인에도 사용할 수 있습니다.

+0

+1 시간이 지남에 따라 코드가 진화함에 따라 눈에 잘 띄지 않는 종류의 테스트입니다. 테스트하지 않는 이유는 거의 없습니다. – Cocowalla

+0

어떻게 실제로 테스트 할 수 있습니까? 컴파일러 오류를 보여주기 때문에 위와 같이 속성을 설정하지 않으시겠습니까? 아니면 나는 간단한 것을 놓치고 있는가? – lancscoder

+0

+1 여기 아주 작은 테스트! 엎드려서 신속하게, 우리가 좋아하는 것처럼! 감사! –

7

은 어떤 논리를 포함하지 않는이 => 아무것도

+0

+1이 간단한 테스트 규칙을 이용해 주셔서 감사합니다. –

0

단순한 경우에도 생성자에는 논리가 있습니다.

RuleViolation ruleViolation = new RuleViolation("This is the error message"); 
Assert.AreEqual("This is the error message", ruleViolation.ErrorMessage); 
Assert.IsEmpty(ruleViolation.PropertyName); 

RuleViolation ruleViolation = new RuleViolation("This is the error message", "ThisIsMyProperty"); 
Assert.AreEqual("This is the error message", ruleViolation.ErrorMessage); 
Assert.AreEqual("ThisIsMyProperty", ruleViolation.PropertyName); 
1

당신 단위 테스트 객체, 그러나 그것을 필요로하지 않는 것처럼 그렇게 간단하다 : 그 테스트 것입니다. 당신은 .NET 프레임 워크의 특성이 올바르게 작동하는지 테스트로 테스트는, 그러나, 같은 (NUnit과 예)

[Test] 
public void TestRuleViolationConstructorWithErrorMessageParameterSetsErrorMessageProperty() { 
    // Arrange 
    var errorMessage = "An error message"; 

    // Act 
    var ruleViolation = new RuleViolation(errorMessage); 

    // Assert 
    Assert.AreEqual(errorMessage, ruleViolation.ErrorMessage); 
} 

이와 같은 테스트를 작성 거의 가치가있어이 될 것입니다. 일반적으로 Microsoft는 다음과 같은 권리가 있다고 믿을 수 있습니다.

조롱과 관련하여 테스트중인 클래스가 종속성을 가지고 있거나, 아마도 자신의 응용 프로그램에있는 다른 클래스 또는 프레임 워크의 형식에 종속되어있을 때 유용합니다. Mocking 프레임 워크를 사용하면 코드에서 종속성을 구체적으로 작성하는 번거 로움없이 종속성에 대한 메서드 및 속성을 호출 할 수 있으며 대신 속성에 대한 정의 된 값, 메서드에 대한 반환 값 등을 삽입 할 수 있습니다. Moq은 훌륭한 프레임 워크이며

[Test] 
public void TestCalculateReturnsBasicRateTaxForMiddleIncome() { 
    // Arrange 
    // TaxPolicy is a dependency that we need to manipulate. 
    var policy = new Mock<TaxPolicy>(); 
    bar.Setup(x => x.BasicRate.Returns(0.22d)); 

    var taxCalculator = new TaxCalculator(); 

    // Act 
    // Calculate takes a TaxPolicy and an annual income. 
    var result = taxCalculator.Calculate(policy.Object, 25000); 

    // Assert 
    // Basic Rate tax is 22%, which is 5500 of 25000. 
    Assert.AreEqual(5500, result); 
} 

TaxPolicy가 제대로 작동하는지 확인하기 위해 자신의 고정 테스트 단위 것 : 의존성을 가진 기본 클래스에 대한 테스트는 다음과 같이 보일 것입니다. 여기서는 TaxCalculator이 올바르게 작동하는지 테스트하기를 원하므로 TaxPolicy 객체를 조롱하여 테스트를 더 간단하게 만듭니다. 그래서 우리는 관심이있는 TaxPolicy 비트의 동작을 지정할 수 있습니다. 그것이 없으면 우리는 핸드 롤 모크/스텁/가짜를 만들거나 TaxPolicy의 실제 인스턴스를 만들어 전달해야 할 것입니다.

그러나 이것보다 Moq에 더 많은 것이 있습니다. quick-start tutorial을 확인하여 더 많은 정보를 확인하십시오.

1

클래스가 아무리 간단하거나 복잡하다해도 내 코드와 객체라면 테스트 해 볼 수 있습니다. 수업이 중단 될 것 같지 않더라도 시험은 IMO에서 가정, 설계 결정 및 적절한 사용법을 문서화 한 것입니다.

이렇게하면 의도 한대로 작동하는지 확인할 수있을뿐만 아니라 일반적인 시나리오를 생각해 볼 수 있습니다. (결국 매개 변수가 null 또는 비어 있거나 끝에 공백이 있으면 어떻게됩니까? 변경할 수없는 클래스에서 PropertyName은 선택 사항입니까?).

요구 사항이 변경되면 (i?) 요구 사항이 변경되면이를 처리하기위한 시작점이 있습니다. 그리고이 사소한 클래스가 어떻게 든 다른 클래스와 잘 상호 작용하지 않는다면, 고객이하기 전에 그것을 잡을 수있는 테스트가있을 수 있습니다.

코드를 작성하는 것이 올바른 방법 일뿐입니다.

HTH,
Berryl는

관련 문제