私はMVCウェブアプリケーションを持っており、私はDIのためにSimple Injectorを使っています。私のコードのほとんどは単体テストの対象です。しかし、いくつかのコントローラでいくつかのテレメトリコールを追加したので、依存関係を設定する際に問題があります。ユニットテストでのアプリケーションインサイトの使用
テレメトリコールは、Microsoft AzureでホストされているApplication Insightsサービスにメトリックを送信するためのものです。このアプリはAzureで動作していないだけで、ISSのサーバです。 AIポータルでは、テレメトリライブラリを使用して送信したカスタムイベントなど、アプリケーションに関するあらゆる種類のことがわかります。その結果、コントローラには、Microsoft.ApplicationInsights.TelemetryClientのインスタンスが必要です。このインスタンスにはInterfaceはなく、密接なクラスで、2つのコンストラクタがあります。私はそうのようにそれを登録してみました(ハイブリッドライフスタイルは、私は完全を期すためにそれを含め、この質問には無関係です):
// hybrid lifestyle that gives precedence to web api request scope
var requestOrTransientLifestyle = Lifestyle.CreateHybrid(
() => HttpContext.Current != null,
new WebRequestLifestyle(),
Lifestyle.Transient);
container.Register<TelemetryClient>(requestOrTransientLifestyle);
問題はTelemetryClientは2つのコンストラクタを持っているため、SIは不平を言うと、検証に失敗したということです。コンテナのコンストラクタの解決動作をオーバーライドする方法を示す記事を見つけましたが、それはかなり複雑です。
私がTelemetryClientを注入された依存性にしない(クラスに新しいものを作成するだけの場合)、ユニットの実行ごとにそのテレメトリーがAzureに送信されるでしょうか?多くの偽のデータを作成しますか?または、Application Insightsがユニットテストで実行され、データを送信していないことを知るには十分にスマートですか?
この問題への「洞察」は何か大変ありがとうございます。
おかげ
私は質問のAI側を助けることはできませんが、登録はで簡単に行うことができます特定のコンストラクタをターゲットとするデリゲートを登録します: 'container.Register(()=> new TelemetryClient(/ *ターゲットにするコンストラクタ* /)、requestOrTransientLifestyle);また、[DefaultScopedLifestyle](https://simpleinjector.readthedocs.org/en/latest/lifetimes.html#scoped) – qujck
をチェックしてください。単体テストについては、必要に応じて模擬できるTelemetryClient上に独自の抽象化を定義する必要があります。ユニットテストはAzureと対話してはいけません。 – qujck
あなたのカスタムハイブリッドスコープは私に心配です。 Web要求ライフスタイルと過渡的なライフスタイルを混在させることは、通常、良い方法ではありません。あなたはなぜこのような混合ライフスタイルが必要なのか説明できますか? – Steven