2012-03-16 1 views
13

PostSharpでの実装について、これをquestionに依頼した後、私はこのアスペクトのコードを将来的に更新しなければならない可能性があり、後ですべてを壊す危険を冒すつもりはないと思いました。ユニットテストポストシャープのアスペクトはどうですか?

私はユニットテストについて考え始めました。

私の最初の質問は次のとおりです。

は、それが関連する側面をテストするユニットを考えることですか?

答えは「はい」ですが、そうでない場合は他のアドバイスが必要です。 PostSharpの側面のためのユニットテストを実装する方法

そして、もしそうなら、

答えて

10

はい、これは機能を表すものであり、複数の場所で使用しているため、テストすることがさらに重要です。

あなたは二つの部分にこれをdevideする必要がしかし:コンテキスト抽出はそれが実際にアスペクト機能

を実行するために使用されて正常に動作しているかどうかを

  1. テスト実際のアスペクト機能
  2. テストを最初の部分では、アスペクト機能を適切に実行する属性から実際の機能性を切り離した場合、単体テストの作成は単体テストの通常のコードと変わらないはずです。

    コンテキストの抽出を切り離す必要がありますが、これは過度のように思えるかもしれませんが、単体テストを正しくテストすれば、私は恐れがあります。

    コンパイル時の検証も使用する必要があります。これにより、間違った方法で属性を使用できなくなる可能性もあります。場合によっては、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 uldは約MethodExecutionArgsを知らない。
    • MethodExecutionArgsから引数を抽出することは、トレースの一部ではなく、アスペクトに関連しています。あなたがそれをテストできるようにしたいので、何とかそれを分離する必要があります。
+0

私は完全にあなたの "最初の部分" に同意します。あなたの「第2の部分」については、これが私の質問の要点である「これはどのように見えるか」を理解するためにコードサンプルを探しています。私はあなたの提案に従ってコンパイル時間検証を調査します。 – remio

+1

@remio私は、テスト可能にするために別のタスクを分ける方法のサンプルで自分の答えを更新しました – ntziolis

+0

私はそれを手に入れます。デカップリングが鍵です。あなたの明示的な例をありがとうございました。 – remio

関連する問題