Possiedo un'app Web MVC e sto utilizzando Simple Injector per DI. Quasi tutto il mio codice è coperto da test unitari. Tuttavia, ora che ho aggiunto alcune chiamate di telemetria in alcuni controller, ho problemi a configurare le dipendenze.Utilizzo delle informazioni sulle applicazioni con i test delle unità?
Le chiamate di telemetria sono per l'invio di metriche al servizio Application Insights ospitato da Microsoft Azure. L'app non è in esecuzione in Azure, ma solo un server con ISS. Il portale AI ti dice tutti i tipi di cose sulla tua applicazione, compresi gli eventi personalizzati che invii usando la libreria di telemetria. Di conseguenza, il controller richiede un'istanza di Microsoft.ApplicationInsights.TelemetryClient, che non ha un'interfaccia ed è una classe sealed, con 2 costruttori. Ho provato a registrarlo in questo modo (lo stile di vita ibrido non è correlata a questa domanda, ho solo incluso per completezza):
// 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);
Il problema è che, poiché TelemetryClient ha 2 costruttori, SI lamenta e non riesce la convalida. Ho trovato un post che mostra come sovrascrivere il comportamento di risoluzione del costruttore del contenitore, ma ciò sembra piuttosto complicato. Per prima cosa volevo eseguire il backup e porre questa domanda:
Se non faccio in modo che TelemetryClient sia una dipendenza iniettata (basta crearne uno nuovo nella classe), tale telemetria verrà inviata ad Azure ad ogni esecuzione dell'unità test, creando molti dati falsi? Oppure Application Insights è abbastanza intelligente da sapere che è in esecuzione in un test unitario e non invia i dati?
Qualsiasi "approfondimento" in questo numero sarebbe molto apprezzato!
Grazie
non posso fare con il lato AI della questione, ma la registrazione può essere effettuata semplicemente registrando un delegato che si rivolge a un costruttore specifico: 'container.Register (() => nuovo TelemetryClient (/ * qualunque sia il costruttore che si desidera utilizzare come target * /), requestOrTransientLifestyle);'. Controlla anche [DefaultScopedLifestyle] (https://simpleinjector.readthedocs.org/en/latest/lifetimes.html#scoped) – qujck
Per il test delle unità, devi definire la tua astrazione su TelemetryClient che puoi prendere in giro come richiesto. I test unitari non dovrebbero parlare con Azure. – qujck
Il tuo ambito ibrido personalizzato mi preoccupa. Mescolare lo stile di vita della richiesta web con uno stile di vita transitorio di solito non è una buona pratica. Può spiegare perché hai bisogno di questo stile di vita misto? – Steven