在詢問這個question關於使用PostSharp實現一個方面之後,我想我可能不得不在未來更新這方面的代碼,並且我不想冒任何事後破壞的風險。如何對PostSharp方面進行單元測試?
所以,我開始考慮單元測試。
我的第一個問題是:
是與之相關的考慮單元測試的一個方面?
我想答案是「是」,但如果不是,我期望得到其他建議。
然後,如果是的話,
如何貫徹PostSharp方面單元測試?
在詢問這個question關於使用PostSharp實現一個方面之後,我想我可能不得不在未來更新這方面的代碼,並且我不想冒任何事後破壞的風險。如何對PostSharp方面進行單元測試?
所以,我開始考慮單元測試。
我的第一個問題是:
是與之相關的考慮單元測試的一個方面?
我想答案是「是」,但如果不是,我期望得到其他建議。
然後,如果是的話,
如何貫徹PostSharp方面單元測試?
是的,單元測試方面肯定有意義,因爲它們代表了功能,而且由於您在多個地方使用它,測試它更重要。
但是你必須devide分爲兩個部分是:
對於第一部分,如果您已將實際功能與正確執行方面功能的屬性分離開來,那麼創建單元測試應該與單元測試普通代碼沒有區別。
對於第二部分,你需要分離上下文的提取,這可能看起來像是矯枉過正,但如果你想單元測試它,你會需要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
:
MethodExecutionArgs
。MethodExecutionArgs
中提取參數不是跟蹤的一部分,它與方面更相關。既然你想能夠測試它,你需要以某種方式分離它。
我與你的 「第一部分」 完全同意。關於你的「第二部分」,我正在尋找代碼示例以瞭解「這將如何」,因爲這是我的問題的關鍵點。我將根據您的建議調查編譯時間驗證。 – remio 2012-03-16 14:16:02
@remio我已經更新了我的答案,如何分離不同的任務以使它們可測試 – ntziolis 2012-03-16 15:27:04
我明白了。解耦是關鍵。非常感謝您的明確示例。 – remio 2012-03-23 10:44:57