Domanda

Sto affrontando uno strano problema relativo a AutoFixture e AutoMoqCustomization e come si tratta di Automlocking di classi di calcestruzzo. Sospetto che non lo stia usando molto bene, ma vorrei sapere qual è il problema. Prima di tutto il suo contesto. Diciamo che ho una classe che voglio testare:

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

E la sua classe di dipendenza TenantProvisioningService (Le dipendenze del Tenantprovisioningservice non sono rilevanti qui perché saranno auto derissi e non mi importa nel mio test):

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;
    }
}
.

Ed ecco il mio semplice test:

[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
}
.

Questo non funziona perché quando chiamo fixture.Create<IdentityApplicationService>(), quindi nel suo costruttore è iniettato un tenantProvisioningService in calcestruzzo invece di uno proxied che puoi trovare in mocktenantprovisioningservice.object .

Se riscrivi il test come questo (nota la riga inject fixture) tutto funziona come previsto (da me almeno :))

[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
}
.

Quindi la mia domanda è : Sto facendo male o è così dovrebbe essere? In caso contrario, per favore dammi la spiegazione perché l'autofixture si comporta come questa.

È stato utile?

Soluzione

AS Mark Seemann sottolinea , questo è ilComportamento previsto.

Di seguito è riportato il codice da Il post originale Aggiornato aLavora con la versione corrente di 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())));
.

La classe FilteringRelays rimane la stessa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top