AutoFixture avec AutoMoq et de béton objet d'injection
-
20-12-2019 - |
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.
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.