4

ひどいタイトルを前もってお詫びします-提案を歓迎します!

私は DI と AOP について読んできましたが、基本は理解できたと思います。少なくとも、ロギングを追加する標準的な例については。

これを NUnit で作成しているテスト ケースに適用したいと思います。たとえば、すべてのテスト ケース メソッドとそれらが呼び出す「ヘルパー メソッド」の入口/出口ログを自動的に追加できるようにします。(そして、私は NUnit に縛られていません。別のフレームワークの方が簡単な場合は、お知らせください。)

注 - これはテスト中の被験者に関するものではありません。これらの手法をテストケース自体に適用したいと考えています。

PostSharpを使用してこれを行う方法は非常に明確です。これは最初の例です。ただし、この実験のためだけに、彼らのライセンスの取り扱いを私たちのプロジェクトに追加したくはありません。

C# 用の AOP について私が見つけた他のすべてのリファレンスは、CastleWindsor、Unity、Spring.Net などの IoC コンテナー実装によって提供される (動的) インターセプターに基づいています。この場合、これらすべてに共通の問題があります。インターセプターを追加するオブジェクトのプロキシを作成するセットアップ コードの一部。(当初、このコードは IoC コンテナーも作成する必要があると思っていましたが、間違っていることがわかりました。)

しかし、このセットアップ コードが nUnit テストケースのどこに行くのかわかりません。

私が思いついたオプションとその問題:

  1. testfixture クラスのコンストラクターにそれ自体へのプロキシを作成させます。再帰が原因で機能しません (消費者が物を要求し、物がプロキシを物に戻そうとし、プロキシが物を作成しようとしています...このStackOverflowの質問を読んでから)
  2. 私自身の反射ベースの魔法をロールバックします(これは私にとって大きな仕事になるでしょう)
    1. コンストラクターに testfixture クラスのすべてのメソッドをラップさせ、この「ラップされた」オブジェクトを返します (コンストラクターがこれを実行できるかどうかはわかりません)。
    2. テストフィクスチャで静的コンストラクターを使用してこの魔法を行います (クラスのメソッドを動的にラップできると仮定します)。
    3. ( Einar Egilsson の InjectModuleInitializerを介して) モジュール cctor を使用してモジュール レベルで何かを行い、すべてのクラスのすべてのメソッドをログでラップします。
  3. 最も単純なもの: テストケース (テストのパラメーターではない) をインスタンス化するためのある種のファクトリ。そこから IoC プロキシ ジェネレーターの 1 つを使用できます。
    1. nUnit の場合: これを行う唯一の方法は、カスタム AddInを作成することです。利点 - ReSharper との統合が損なわれない可能性があります。欠点 - 特に NUnit の更新時に、すべての開発マシンに展開します。nUnitでこれを行う他の方法はありますか?
    2. MbUnitの場合:テストケースをファーストクラスの値として扱うように見えますが、これは簡単です。利点: すべての開発者に簡単にデプロイできます。欠点: テストは Resharper に表示されません。補足:セットアップとティアダウンの処理方法

選択肢や結論に何か見落としがありますか?

私が見逃したこれを行う簡単な方法はありますか?

4

2 に答える 2

1

アスペクト指向プログラミングは、動的プロキシ (インターセプト) やコンパイル後のコード ウィービング (PostSharp) を使用するだけではありません。AOP は、主に分野横断的な関心事の追加に関するものです。動的プロキシの使用は、分野横断的な懸念を追加する 1 つの方法です。コード ウィービングは、これを行う別の方法です。しかし、分野横断的な懸念を追加する別の、IMO より優れた方法があります。

動的プロキシやコード ウィービングを使用する代わりに、アプリケーションの設計に任せてください。適切な抽象化を使用してアプリケーションを設計すると、デコレーターを使用して分野横断的な懸念事項を簡単に追加できます。適切な抽象化を使用して設計されたシステムの例は、ここここにあります。

これらの記事では、デコレーターを使用して分野横断的な関心事を定義する方法について説明しています。このようにシステムを設計すると、分野横断的な問題の実装を残りのコードとは別にテストできます。適切な抽象化を使用すると、これは簡単になります。

これを行う場合、単体テストで特別なことをする必要はありません。コードを織り込む必要はなく、テストで DI コンテナーを実行してオブジェクトを構築する必要もありません。分野横断的な懸念を邪魔することなく、アプリケーション ロジックをテストできます。すべての小さなピースを分離してテストし、すべてのピースをアプリケーションのコンポジション ルートにまとめることができます。

于 2012-11-20T10:20:55.783 に答える