Question

Je suis confronté à un problème étrange liées à AutoFixture et AutoMoqCustomization et la façon dont il traite avec automocking de classes concrètes.Je soupçonne que je ne suis pas à l'aide, il est très bien mais je voudrais savoir quel est le problème.Tout d'abord son contexte.Disons que j'ai une classe que je veux tester :

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

et de sa dépendance de la classe TenantProvisioningService (TenantProvisioningService les dépendances ne sont pas pertinentes ici, car ils seront auto se moquèrent de lui et je ne se soucient pas dans mon 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;
    }
}

et voici mon test 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
}

Cela ne fonctionne pas car quand je l'appelle fixture.Create<IdentityApplicationService>() puis, dans son constructeur en béton TenantProvisioningService est injecté à la place d'un proxy que vous pouvez trouver dans mockTenantProvisioningService.Objet.

Si je réécris le test comme ceci (notez le luminaire injecter ligne) tout fonctionne comme attendu (par moi au moins :))

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

Donc ma question est :Suis-je le fais mal ou est-ce la façon dont il devrait être?Si non, merci de me donner l'explication de AutoFixture est de se comporter comme cela.

Était-ce utile?

La solution

En Tant Que Marque Seemann souligne, c'est le comportement attendu.

Ci-dessous est le code de le post original mis à jour pour fonctionner avec la version actuelle 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())));

L' FilteringRelays la classe reste le même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top