W moich testach integracji używam tego samego SimpleInjector.Container, który buduję w projekcie Web API, który testuję.container.RegisterWebApiControllers (GlobalConfiguration.Configuration) powoduje InvalidOperationException
Ale ta linia w skład klasy root:
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
powoduje wyjątek:
System.TypeInitializationException : The type initializer for 'MyProject.Api.Test.Integration.HttpClientFactory' threw an exception.
---- System.InvalidOperationException : This method cannot be called during the application's pre-start initialization phase.
Result StackTrace:
at MyProject.Api.Test.Integration.HttpClientFactory.Create()
at MyProject.Api.Test.Integration.Controllers.ProductControllerIntegrationTest.<GetProductBarcode_Should_Return_Status_BadRequest_When_Barcode_Is_Empty>d__0.MoveNext() in d:\Projects\My\MyProject.Api.Test.Integration\Controllers\ProductControllerIntegrationTest.cs:line 26
----- Inner Stack Trace -----
at System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()
at System.Web.Compilation.BuildManager.GetReferencedAssemblies()
at System.Web.Http.WebHost.WebHostAssembliesResolver.System.Web.Http.Dispatcher.IAssembliesResolver.GetAssemblies()
at System.Web.Http.Dispatcher.DefaultHttpControllerTypeResolver.GetControllerTypes(IAssembliesResolver assembliesResolver)
at System.Web.Http.WebHost.WebHostHttpControllerTypeResolver.GetControllerTypes(IAssembliesResolver assembliesResolver)
at SimpleInjector.SimpleInjectorWebApiExtensions.GetControllerTypesFromConfiguration(HttpConfiguration configuration)
at SimpleInjector.SimpleInjectorWebApiExtensions.RegisterWebApiControllers(Container container, HttpConfiguration configuration)
at MyProject.Api.ContainerConfig.RegisterTypes(Container container) in d:\Projects\My\MyProject.Api\App_Start\ContainerConfig.cs:line 128
at MyProject.Api.ContainerConfig.CreateWebApiContainer() in d:\Projects\My\MyProject.Api\App_Start\ContainerConfig.cs:line 63
at MyProject.Api.Test.Integration.HttpClientFactory..cctor() in d:\Projects\My\MyProject.Api.Test.Integration\HttpClientFactory.cs:line 17
Po komentując to wszystko działa poprawnie, zarówno samą aplikację internetową i testy.
Więc pytanie brzmi:
- Co jest powodem wyjątkiem?
- (i jest to metoda naprawdę konieczne?)
Oto kod dla HttpClientFactory (klasa pomocnika stworzyć HttpClient z odpowiednich nagłówków, takich jak klucz API lub zezwolenia):
internal static class HttpClientFactory
{
private static readonly Container _container = ContainerConfig.CreateWebApiContainer();
public static HttpClient Create()
{
var client = new HttpClient { BaseAddress = GetUrl() };
//...
return client;
}
}
Czy możesz opublikować szczegóły InnerException i StackTrace? Czy masz jakieś wiążące przekierowania w pliku konfiguracyjnym? –
Zgadzam się z @DarinDimitrov, proszę podać nam pełny ślad stosu. Trudno o tym myśleć bez tych szczegółów. – Steven
@ Darin: Zaktualizowano, dziękuję! Binding przekierowania są bardzo podobne do tego, co mam w Web.config. – abatishchev