La configuración de http se establece en la clase de inicio, por lo general, que está vinculada al método Create.
Pero, ¿qué pasa si quiero iniciar un servidor owin UNA vez para TODAS las pruebas pero actualizar su configuración http según las necesidades de cada prueba?
Esto no es posible. El objeto del servidor no tiene nada útil.
using (var server = TestServer.Create<Startup>()) { var data = server.HttpClient.GetAsync("/api/data); }Lo que quiero hacer para las pruebas de integración CRUD es agregar los métodos de servicio
// Do it ONE time fall ALL tests WebApiConfig.Register(config); WebServicesConfig.Register(config); // Do it individually for each test, Update DI registerations with Fake components per test method var builder = new ContainerBuilder(); var mockContext = new Mock<TGBContext>(); var mockService = new Mock<SchoolyearService>(mockContext.Object); mockService.Setup<Task<IEnumerable<SchoolyearDTO>>>(c => c.GetSchoolyearsAsync()).Returns(Task.FromResult(Enumerable.Empty<SchoolyearDTO>())); // builder.RegisterInstance<TGBContext>(); ****** NO NEED for this it works without registering the ctor parameter dependency builder.RegisterInstance<SchoolyearService>(mockService.Object); builder.Update(((AutofacWebApiDependencyResolver)config.DependencyResolver).Container as IContainer);Por el momento me veo obligado a crear un TestServer por método de prueba.
Eso es una sobrecarga total en el tiempo.
SOLUCIÓN
Haga que HttpConfiguration sea estático y este código debería funcionar:
var builder = new ContainerBuilder(); var mockContext = new Mock<TGBContext>(); var mockService = new Mock<SchoolyearService>(mockContext.Object); mockService.Setup<Task<IEnumerable<SchoolyearDTO>>>(c => c.GetSchoolyearsAsync()).Returns(Task.FromResult(Enumerable.Empty<SchoolyearDTO>())); builder.RegisterInstance<SchoolyearService>(mockService.Object); builder.Update(((AutofacWebApiDependencyResolver)Configuration.DependencyResolver).Container as IContainer);si desea iniciar el servidor OWIN una vez para todas las pruebas.
private static readonly TestServer _webServer = TestServer.Create<Startup>();
protected static TestServer WebServer { get { return _webServer; } }
esto debería resolver su problema de instanciar el servidor web solo una vez para todas las ejecuciones de prueba. y si no desea inicializar el servidor web tan temprano, puede usar la creación de instancias perezosas, etc., pero el punto es hacerlo estático e inicializarlo en el momento de la definición, de modo que sea una vez por dominio de la aplicación.
en cuanto a obtener acceso a HttpConfiguration en sus pruebas unitarias... aquí hay una forma posible...
public static HttpConfiguration HttpConfiguration { get; private set; }
inicialice esta variable en el método de configuración de la clase Startup.cs.
HttpConfiguration = new HttpConfiguration(); HttpConfiguration.MapHttpAttributeRoutes(); // do more stuff.. setting resolver etc. // and then finally app.UseWebApi(HttpConfiguration);Esta propiedad HttpConfiguration es la configuración de su API web y debido a que la convertimos en una propiedad pública, debe ser accesible en su proyecto de prueba y para todas las pruebas.
Startup.HttpConfigurationpuede acceder a él para modificar las definiciones de resolución de dependencia, etc.
Startup.HttpConfiguration.DependencyResolvertenga en cuenta que puede actualizar las definiciones de DependencyResolver incluso después de inicializar el servidor web... las definiciones actualizadas seguirán teniendo su efecto.