visual unitarias unit test studio pruebas mvc c# unit-testing dependency-injection integration-testing autofac

test - pruebas unitarias c# visual studio 2017



Anular el registro de Autofac-Pruebas de integraciĆ³n con DI (2)

Autofac utilizará el último componente registrado como el proveedor predeterminado de ese servicio

De la documentación de AutoFac.

En su fase de organización / configuración / prueba, registre los simulacros y luego resuelva el SUT:

[SetUp] public void TestInit() { Mock<IFoo> mock = new Mock<IFoo>(); builder.RegisterInstance(mock.object).As<IFoo>(); ... ... _target = builder.Resolve<The component>(); }

Nota:

Singletons, miembros estáticos y SingletonLifestyle (registro) pueden causar algunos problemas ...

Escribo pruebas de integración para mi aplicación y uso mi contenedor para esto. Quiero poder registrar todos los componentes como lo hago en ejecución real, y luego anular algunos de los componentes y cambiarlos para usar implementaciones de stubs.

No me gustaría separar la DI y tener un contenedor para las pruebas solo porque quiero probar la realidad.

Hacer esto también parece feo:

public class MyRegistrations { public static RegisterAll(bool isInTest= false) { if (isTest) { // Register test fakes } else // Register real components } }

Así que pensé en anular los registros en mi entorno de prueba. ¿Cómo deberia hacerse?

¿Alguna otra forma mejor para lograr mi objetivo?

Gracias


Bueno, por ejemplo, puede crear un método de acción estático dentro de su raíz de composición para alterar la configuración actual y llamarla durante la prueba. Por ejemplo:

public class CompositionRoot { public static Action<IContainer> OverrideContainer = c => { }; internal static IContainer CreateContainer() { ContainerBuilder builder = new ContainerBuilder(); /// etc. etc. var container = builder.Build(); OverrideContainer(container); return container; } }

Después de eso, puedes crear un simulacro de tu servidor, por ejemplo, así:

[TestFixture] public class ConfigurationControllerFixture : BaseServer { [Test] public async Task verify_should_get_data() { var response = await GetAsync(Uri); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); } protected override string Uri { get { return "api/configuration"; } } } public abstract class BaseServer { protected TestServer Server; protected abstract string Uri { get; } protected virtual void OverrideConfiguration() { CompositionRoot.OverrideContainer = c => { // new autofac configuration cb.Update(c); }; AppStartup.OverrideConfiguration = c => { // same as explained, but for HttpConfiguration }; } } [SetUp] public void Setup() { OverrideConfiguration(); Server = Microsoft.Owin.Testing.TestServer.Create(app => { var startup = new AppStartup(); startup.Configuration(app); }); PostSetup(Server); }

Espero eso ayude :)