Pregunta

Estoy enfrentando un problema extraño relacionado con AutoFixture y AutoMoqCustomization y cómo se ocupa de la simulación automática de clases concretas.Sospecho que no lo estoy usando muy bien pero me gustaría saber cuál es el problema.En primer lugar, hay algo de contexto.Digamos que tengo una clase que quiero probar:

public class IdentityApplicationService
{
    public IdentityApplicationService(
        TenantProvisioningService tenantProvisioningService)
    {
        // guard clause etc.
        _tenantProvisioningService = tenantProvisioningService;
    }
}

y su clase de dependencia TenantProvisioningService (Las dependencias de TenantProvisioningService no son relevantes aquí porque se burlarán automáticamente de ellas y no me importan en mi prueba):

public class TenantProvisioningService
{
    readonly IRoleRepository _roleRepository;
    readonly ITenantRepository _tenantRepository;
    readonly IUserRepository _userRepository;

    public TenantProvisioningService(
        ITenantRepository tenantRepository,
        IUserRepository userRepository,
        IRoleRepository roleRepository)
    {
        this._roleRepository = roleRepository;
        this._tenantRepository = tenantRepository;
        this._userRepository = userRepository;
    }
}

y aquí está mi prueba simple:

[Fact]
public void ShouldReturnTenantWhenCallingProvisionTenant()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    var mockTenantProvisioningService =
        fixture.Freeze<Mock<TenantProvisioningService>>();
    var sut = fixture.Create<IdentityApplicationService>();
    var command = new ProvisionTenantCommand(
        "bla",
        "bla SaaS platform",
        "superadmin",
        "superadmin",
        "admin@bla.bla",
        null,
        null,
        null,
        null,
        null,
        null,
        null);
    var tenant = sut.ProvisionTenant(command);

    // some asserts
}

Esto no funciona porque cuando llamo fixture.Create<IdentityApplicationService>() luego, en su constructor, se inyecta un TenantProvisioningService concreto en lugar de uno proxy que puede encontrar en simuladoTenantProvisioningService.Objeto.

Si reescribo la prueba de esta manera (tenga en cuenta la línea de inyección del dispositivo), todo funciona como se esperaba (al menos para mí :))

[Fact]
public void ShouldReturnTenantWhenCallingProvisionTenant()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    var mockTenantProvisioningService =
        fixture.Freeze<Mock<TenantProvisioningService>>();
    fixture.Inject(mockTenantProvisioningService.Object);
    var sut = fixture.Create<IdentityApplicationService>();
    var command = new ProvisionTenantCommand(
        "bla",
        "bla SaaS platform",
        "superadmin",
        "superadmin",
        "admin@bla.bla",
        null,
        null,
        null,
        null,
        null,
        null,
        null);
    var tenant = sut.ProvisionTenant(command);

    // some asserts
}

Entonces mi pregunta es :¿Lo estoy haciendo mal o es como debería ser?Si no, por favor dame la explicación de por qué AutoFixture se comporta así.

¿Fue útil?

Solución

Como Mark Seemann Señala, este es el comportamiento esperado.

A continuación se muestra el código de la publicación original actualizado para funcionar con la versión actual de AutoFixture:

Func<ISpecimenBuilder, bool> concreteFilter = 
    sb => !(sb is MethodInvoker);

var relays = new FilteringRelays(concreteFilter);

var fixture = new Fixture(relays).Customize(
    new AutoMoqCustomization(
        new MockRelay(
            new TrueRequestSpecification())));

El FilteringRelays la clase sigue siendo la misma.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top