Autofixture con iniezione di oggetti automobilistici e calcestruzzo
-
20-12-2019 - |
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.
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.