2010-06-11 74 views
5

我最近解決了使用裝飾模式的問題之一。一切工作正常,一切都足夠脫鉤(或者我認爲),我可以單獨測試每個有效字段。單元測試裝飾模式

我的問題是,如果NameValidator和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如此微不足道,它永遠不會破裂。如果有疑問,最好在太多的測試中犯錯:-)這意味着你花了一些額外的時間在一個可能不重要的任務上。相反 - 沒有寫出所需的單元測試 - 意味着你可能會讓一個bug通過你的網絡,這通常是一個更大的問題。

1

是的,你應該單元測試任何可能包含錯誤的類。要單元測試您的ValidationDecorator類,您應該使用IValidator的模擬或存根實現。