我有一個MVC網絡應用程序,我正在使用DI簡單注入器。幾乎所有的代碼都被單元測試覆蓋。但是,現在我在某些控制器中添加了一些遙測電話,因此在設置依賴關係時遇到了問題。在單元測試中使用Application Insights?
遙測呼叫用於向Microsoft Azure託管的應用程序見解服務發送指標。該應用程序未在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測試,創造大量的虛假數據?還是應用程序見解足夠聰明,知道它正在單元測試中運行,而不是發送數據?
任何「見解」到這個問題將不勝感激!
由於
我不能與問題的AI側不禁註冊可以簡單地通過做註冊一個指向特定構造函數的委託:'container.Register(()=>新的TelemetryClient(/ *任何你想要定位的構造函數* /),'requestOrTransientLifestyle);'。另外檢查[DefaultScopedLifestyle](https://simpleinjector.readthedocs.org/en/latest/lifetimes.html#scoped) – qujck
對於單元測試,您應該真正定義您自己的TelemetryClient抽象,您可以根據需要進行模擬。單元測試不應該與Azure交談。 – qujck
您的自定義混合範圍令我擔憂。將網絡請求生活方式與短暫生活方式混合通常不是一種好的做法。它可以解釋爲什麼你需要這種混合的生活方式? – Steven