2012-03-16 61 views
13

在詢問這個question關於使用PostSharp實現一個方面之後,我想我可能不得不在未來更新這方面的代碼,並且我不想冒任何事後破壞的風險。如何對PostSharp方面進行單元測試?

所以,我開始考慮單元測試。

我的第一個問題是:

是與之相關的考慮單元測試的一個方面?

我想答案是「是」,但如果不是,我期望得到其他建議。

然後,如果是的話,

如何貫徹PostSharp方面單元測試?

回答

10

是的,單元測試方面肯定有意義,因爲它們代表了功能,而且由於您在多個地方使用它,測試它更重要。

但是你必須devide分爲兩個部分是:

  1. 測試實際方面的功能
  2. 測試是否上下文提取工作正常用來實際執行方面的功能

對於第一部分,如果您已將實際功能與正確執行方面功能的屬性分離開來,那麼創建單元測試應該與單元測試普通代碼沒有區別。

對於第二部分,你需要分離上下文的提取,這可能看起來像是矯枉過正,但如果你想單元測試它,你會需要todo它恐怕。

在該說明中,您還應該使用編譯時驗證,這也可以防止您以錯誤的方式使用屬性。有時候需要測試一些你不能用Attribute語法來描述的條件,然後編譯時間驗證就會發揮作用。這是一個巨大的財富,我和顯著減少關於PostSharp方面的調試會話的數量,請參閱:
http://www.sharpcrafters.com/postsharp/robustness

下面是一些很基本的示例代碼,沒有DI沒什麼,只是爲了說明如何分割的事達:

public sealed class TraceAttribute : OnMethodBoundaryAspect 
{ 
    private readonly string category; 
    private TraceArgumentService argumentService; 
    private TraceService traceService; 

    public string Category { get { return category; } } 

    public TraceAttribute(string category) 
    { 
     this.category = category; 
    } 

    public override void RuntimeInitialize(System.Reflection.MethodBase method) 
    { 
     base.RuntimeInitialize(method); 
     this.argumentService = new TraceArgumentService(); 
     this.traceService = new TraceService(); 
    } 


    public override void OnEntry(MethodExecutionArgs args) 
    {     
     traceService.Write(
      argumentService.GetDeclaringTypeName(args), 
      argumentService.GetMethodName(args), 
      category); 

    } 
} 

public class TraceArgumentService 
{ 
    public string GetDeclaringTypeName(MethodExecutionArgs args) 
    { 
     return args.Method.DeclaringType.Name; 
    } 

    public string GetMethodName(MethodExecutionArgs args) 
    { 
     return args.Method.Name; 
    } 
} 

public class TraceService 
{ 
    public void Write(string declaringTypeName, string methodName, string category) 
    { 
     Trace.WriteLine(string.Format("Entering {0}.{1}.", 
      declaringTypeName, methodName), category); 
    } 
} 

你可能會問,爲什麼TraceService和獨立TraceArgumentService

  • 跟蹤邏輯應獨立於PostSharp,因此SHO我不知道MethodExecutionArgs
  • MethodExecutionArgs中提取參數不是跟蹤的一部分,它與方面更相關。既然你想能夠測試它,你需要以某種方式分離它。
+0

我與你的 「第一部分」 完全同意。關於你的「第二部分」,我正在尋找代碼示例以瞭解「這將如何」,因爲這是我的問題的關鍵點。我將根據您的建議調查編譯時間驗證。 – remio 2012-03-16 14:16:02

+1

@remio我已經更新了我的答案,如何分離不同的任務以使它們可測試 – ntziolis 2012-03-16 15:27:04

+0

我明白了。解耦是關鍵。非常感謝您的明確示例。 – remio 2012-03-23 10:44:57