Frage

Ich stehe vor einem seltsamen Problem im Zusammenhang mit AutoFixture Und AutoMoqCustomization und wie es mit der automatischen Verspottung konkreter Klassen umgeht.Ich vermute, dass ich es nicht sehr gut verwende, würde aber gerne wissen, wo das Problem liegt.Zunächst einmal gibt es einen Kontext.Nehmen wir an, ich habe eine Klasse, die ich testen möchte:

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

und seine Abhängigkeitsklasse TenantProvisioningService (Die Abhängigkeiten von TenantProvisioningService sind hier nicht relevant, da sie automatisch verspottet werden und mir in meinem Test egal sind):

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

und hier ist mein einfacher 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
}

Das funktioniert nicht, denn wenn ich anrufe fixture.Create<IdentityApplicationService>() Dann wird in seinem Konstruktor ein konkreter TenantProvisioningService anstelle eines Proxy-Service eingefügt, den Sie finden können mockTenantProvisioningService.Object.

Wenn ich den Test so umschreibe (beachten Sie die Fixture-Inject-Zeile), funktioniert alles wie erwartet (zumindest von mir :))

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

Meine Frage ist also :Mache ich es falsch oder ist es so, wie es sein sollte?Wenn nicht, erklären Sie mir bitte, warum sich AutoFixture so verhält.

War es hilfreich?

Lösung

Als Mark Seemann weist darauf hin, das ist das erwartete Verhalten.

Unten ist der Code von der ursprüngliche Beitrag aktualisiert, um mit der aktuellen Version von AutoFixture zu funktionieren:

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())));

Der FilteringRelays Klasse bleibt gleich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top