2016-04-07 7 views

答えて

1

追加のメソッドを作成し、属性を持つメソッド内でメソッドを呼び出すことができます。したがって、属性なしでメソッドをテストできます。

[TraceAspect] 
public void Post() 
{ 
    PostWithoutAttr(); 
} 

public void PostWithoutAttr() 
{ 
    .... 
} 
+0

私はこれが好きです、PostWithoutAttrだけが本当にテストコードによって呼び出されるべきで、それが呼び出されると大きなシステム でシステムに「感染」するのは簡単でしょう、それはまた、 – tolanj

+0

これは良い解決策ですが、私のメソッドはコントローラであり、統合テストを行っているので、その場合はPostWithoutAttr()を直接呼び出すことはできません。しかし、私はユニットテストのためにこれを念頭に置いています。 – wintersolider

3

属性は実行可能コードではありません。それらは単にメタデータです。

属性が何かを「行う」場合は、属性に基づいてコンパイル時にコードが変更されるためです。私はあなたのためにこれを処理するPostSharpのようないくつかのAspectフレームワークを使用していると仮定します。結果のDLLを逆コンパイルすると、その属性がなくなったことがわかり、メソッドのコードにはアスペクトが追加するコードがすべて含まれています。

これを回避するには、アスペクトフレームワークのドキュメントを参照する必要があります。しかし、実際に実行されるコードとは異なるコードをテストすることは非常に良い考えではありません。トレースを別の場所にリダイレクトするなどの代替ソリューションを検討することもできます。

条件付きコンパイルを使用してこれを回避する方法がいくつかありますが、それはうまく機能しません。たとえば、属性自体(#if !TESTING)または属性からコードへの変換を処理するビルド・タスクのいずれかを回避する、ビルド・サーバー上の変数を設定できます。異なるビルド構成を使用して、変換の有無にかかわらずバージョンを持つことができます。しかし、本当に、それらのすべてはかなり醜いです。

+0

"属性が何かを行うのは、コードが属性に基づいてコンパイル時に変更されるためです。 =>または、属性が実行時にリフレクションによって検査されるため、それは指摘する価値があります。 – tolanj

+0

@Luaan私はPostSharpを使用しています。そのうちのOnMethodBoundaryAspectをTraceAspectクラスにポストしてカスタマイズしてカスタマイズしました。今私はこのトレースAspcetクラスを使用して私のコントローラのトレースログに使用しています。テストを実行している間は、トレースログは必要ありませんが、実際には必要になります。 – wintersolider

+0

@wintersoliderええ、私はそれのようなものを期待していました。最も簡単な解決策は、トレースを無視する(トレースリスナなどを設定する)ことです。これは、魔法のようなプロダクションコードではなく、プロダクションコードを実行していることを意味します。 – Luaan

関連する問題