Möchte man einen Integrationstest schreiben und dabei dependency injection nutzen, muss man folgendermaßen vorgehen:
- Im Besten Fall teilt ma die Ausführende Applikation z.B. Web Applikation, Console etc und eine Bibliothek.
- In die Bibliothek kommt die Auslagerung der StartUp:
1234567public static class ServiceCollectionExtensions{public static void UseMyModule(this IServiceCollection services){services.AddTransient<IMyClass, MyClass>();}} - Im Testprojekt wird eine Basis Klasse definiert, die dieses Modul einliest. Nun kann in CofigureServices services.UseMyModule() aufgerufen werden oder der Host selbst gebaut werden:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647[TestClass]public class BaseTestUnit {public static IHost Host { get; set; }[AssemblyInitialize]public static void ClassInitialize(TestContext context) {Host = AssemblyInit(context);}public static IHost AssemblyInit(TestContext context) {var host = Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(new string[0]).ConfigureHostConfiguration(webHost =>{}).ConfigureAppConfiguration((hostContext, config) =>{// AppSettings nach MachineName auslesenconfig.SetBasePath(System.IO.Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true).AddJsonFile($"appsettings.{Environment.MachineName}.json", optional: true).AddEnvironmentVariables();}).ConfigureServices((hostContext, services) =>{services.AddOptions();services.Configure<Application.Configuration.Configuration>(hostContext.Configuration.GetSection("Section in AppSettings"));NLog.Logger logger = NLog.LogManager.GetLogger("NLog Name");services.AddSingleton(logger);services.Configure((Localization.Configuration.LocalizationConfiguration options) => hostContext.Configuration.GetSection("Localization Section in AppSettings").Bind(options));services.AddSingleton<Localization.ILocalizationService, Localization.LocalizationService>();services.AddSingleton<IMyClass, MyClass>();});return host.Start();}public T GetService<T>() => (T)Host.Services.GetService(typeof(T));} - Die eigentliche Test Klasse erbt nun von diesen BaseUnitTest. Nun kann ein Propertiy erzeugt werden, welche einen Service aus der Dependency Injection ausliest:
1public MyClass MyClass => base.GetService<MyClass>();
Login