public static IServiceProvider CreateServices(string applicationWebSiteName, string applicationPath, IServiceCollection newServices = null) { var originalProvider = CallContextServiceLocator.Locator.ServiceProvider; var appEnvironment = originalProvider.GetRequiredService <IApplicationEnvironment>(); // When an application executes in a regular context, the application base path points to the root // directory where the application is located, for example MvcSample.Web. However, when executing // an aplication as part of a test, the ApplicationBasePath of the IApplicationEnvironment points // to the root folder of the test project. // To compensate for this, we need to calculate the original path and override the application // environment value so that components like the view engine work properly in the context of the // test. var appBasePath = CalculateApplicationBasePath(appEnvironment, applicationWebSiteName, applicationPath); var services = new ServiceCollection(); services.AddInstance( typeof(IApplicationEnvironment), new TestApplicationEnvironment(appEnvironment, appBasePath)); // Injecting a custom assembly provider via configuration setting. It's not good enough to just // add the service directly since it's registered by MVC. var providerType = CreateAssemblyProviderType(applicationWebSiteName); var configuration = new TestConfigurationProvider(); configuration.Configuration.Set( typeof(IAssemblyProvider).FullName, providerType.AssemblyQualifiedName); services.AddInstance( typeof(ITestConfigurationProvider), configuration); services.AddInstance( typeof(ILoggerFactory), NullLoggerFactory.Instance); if (newServices != null) { services.Add(newServices); } return(BuildFallbackServiceProvider(services, originalProvider)); }
public static IServiceProvider CreateServices(string applicationWebSiteName) { var originalProvider = CallContextServiceLocator.Locator.ServiceProvider; var appEnvironment = originalProvider.GetService<IApplicationEnvironment>(); // When an application executes in a regular context, the application base path points to the root // directory where the application is located, for example MvcSample.Web. However, when executing // an aplication as part of a test, the ApplicationBasePath of the IApplicationEnvironment points // to the root folder of the test project. // To compensate for this, we need to calculate the original path and override the application // environment value so that components like the view engine work properly in the context of the // test. var appBasePath = CalculateApplicationBasePath(appEnvironment, applicationWebSiteName); var services = new ServiceCollection(); services.AddInstance( typeof(IApplicationEnvironment), new TestApplicationEnvironment(appEnvironment, appBasePath)); // Injecting a custom assembly provider via configuration setting. It's not good enough to just // add the service directly since it's registered by MVC. var providerType = CreateAssemblyProviderType(applicationWebSiteName); var configuration = new TestConfigurationProvider(); configuration.Configuration.Set( typeof(IControllerAssemblyProvider).FullName, providerType.AssemblyQualifiedName); services.AddInstance( typeof(ITestConfigurationProvider), configuration); services.AddInstance( typeof(ILoggerFactory), NullLoggerFactory.Instance); return services.BuildServiceProvider(originalProvider); }