2010-06-11 5 views
5

최근 데코레이터 패턴을 사용하여 제 문제 중 하나를 해결했습니다. 모든 것이 잘 작동하고 모든 것이 분리되어 있으므로 (또는 내가 생각하기에) 각 유효 필드를 개별적으로 단위 테스트 할 수 있습니다.유닛 데코레이터 패턴 테스트하기

MyValidator와 AgeValidator가 모두 Validate() 및 IsValid() (추상) 함수에 대한 테스트를 통과하면 내 질문에 대한 답입니다. 아직 ValidationDecorator 클래스를 단위 테스트해야합니까 (아직 생성되지 않았습니까)? ValidationDecorator는 각 유효성 검사 클래스에 내 유효성 검사기를 꾸미는 것에 대한 책임이 있습니다.

public abstract class FieldValidator 
{ 
    protected IMessage validateReturnType; 

    public FieldValidator() { } 

    public bool IsValid() 
    { 
     return (validateReturnType.GetType() == typeof(Success)); 
    } 
} 

public class NameValidator : FieldValidator, IValidator 
{ 
    private string name; 

    public NameValidator(string _name) { 
     name = _name; 
    } 

    public IMessage Validate() 
    { 
     if (name.Length < 5) 
     { 
      validateReturnType = new Error("Name error."); 
     } 
     else 
     { 
      validateReturnType = new Success("Name no errror."); 
     } 

     return validateReturnType; 
    } 
} 

public class AgeValidator : FieldValidator, IValidator 
{ 
    private int age; 

    public AgeValidator(int _age) 
    { 
     age = _age; 
    } 

    public IMessage Validate() 
    { 
     if (age <= 18) 
     { 
      validateReturnType = new Error("Age error."); 
     } 
     else 
     { 
      validateReturnType = new Success("Age no errror."); 
     } 

     return validateReturnType; 
    } 
} 

public interface IValidator 
{ 
    IMessage Validate(); 
    bool IsValid(); 
} 

이것은 나의 단위 테스트입니다.

[TestFixture] 
public class ValidatorTest 
{ 
    Type successType; 
    Type errorType; 

    Model m; 

    [SetUp] 
    public void SetUp() 
    { 
     successType = typeof(Success); 
     errorType = typeof(Error); 

     m = new Model(); 
     m.Name = "Mike Cameron"; 
     m.Age = 19; 
     m.Height = 325; 

     Validator v = new Validator(); 
     v.Validate(m); 
    } 

    [Test] 
    public void ValidateNameTest() 
    { 
     IValidator im = new NameValidator(m.Name); 

     IMessage returnObj = im.Validate(); 

     Assert.AreEqual(successType, returnObj.GetType()); 
    } 

    [Test] 
    public void IsValidNameTest() 
    { 
     IValidator im = new NameValidator(m.Name); 

     IMessage returnObj = im.Validate(); 

     Assert.IsTrue(im.IsValid()); 
    } 

    [Test] 
    public void ValidateAgeTest() 
    { 
     IValidator im = new AgeValidator(m.Age); 

     IMessage returnObj = im.Validate(); 

     Assert.AreEqual(successType, returnObj.GetType(), "Must be over 18"); 
    } 

    [Test] 
    public void IsValidAgeTest() 
    { 
     IValidator im = new AgeValidator(m.Age); 

     IMessage returnObj = im.Validate(); 

     Assert.IsTrue(im.IsValid()); 
    } 

감사합니다.

답변

4

엄지 손가락의 규칙은 "모든 것을 테스트 할 수있는 가능성이 있습니다"입니다. 이제 깨뜨릴 수있는 것을 판단하는 것은 실제 상황에서 사소한 것과는 거리가 멀다. 그것을 올바르게하기 위해서는 실습과 경험이 필요합니다. 특히 디자인과 코드를 보지 않고 일반적인 조언을하는 것은 불가능합니다.

그래서 결국 ValidationDecorator이 너무 단순하다는 확신이 들었는지 여부 만 신뢰할 수 있습니다. 의심 스러우면, 너무 많은 테스트의 측면에서 실수하는 것이 더 좋습니다 :-) 즉, 아마도 중요하지 않은 작업에 약간의 시간을 소비하는 것을 의미합니다. 반대의 경우 - 필요한 단위 테스트를 작성하지 못하면 일반적으로 더 큰 문제인 버그가 인터넷을 통해 빠져 나가게됩니다.

1

예, 버그가있을 수있는 모든 클래스를 단위 테스트해야합니다. ValidationDecorator 클래스를 단위 테스트하려면 IValidator의 모의 또는 스텁 구현을 사용해야합니다.