Digamos que eu tenha um Service
que tenha uma dependência em TimeProvider
.
O que faço agora para configurar o uso do FakeTimeProvider
AutoFixture e do Moq para meus testes é:
public class FakeTimeProviderCustomization : ICustomization {
public void Customize(IFixture fixture) {
fixture.Customize<TimeProvider>
(c => c.FromFactory(() => new FakeTimeProvider()));
}
}
public class MoqAutoDataAttribute : AutoDataAttribute {
public MoqAutoDataAttribute()
: base(() => new Fixture()
.Customize(new AutoMoqCustomization())
.Customize(new FakeTimeProviderCustomization())
) {
}
}
[Theory, MoqAutoData]
public async Task Test_TimeRelatedStuff(
[Frozen] TimeProvider timeProvider,
Service sut) {
...
var fakeTimeProvider = timeProvider as FakeTimeProvider;
...
Posso evitar o elenco FakeTimeProvider
que tenho que fazer toda vez?
Você pode usar a
Matching
API fornecida pelo[Frozen]
atributo, como mostrado abaixo, mas isso requer que você desativeFakeTimeProviderCustomization
.Este teste passa:
onde eu defini
Service
assim para fins de demonstração:Como já sublinhado, o
Matching.DirectBaseType
critério não funciona bem com aCustomize
API, no sentido de que esta substitui a primeira. Para fazer o teste acima passar, desativei oFakeTimeProviderCustomization
:Obviamente, isso torna a classe ineficaz, então você pode muito bem excluí-la. Estou mostrando o acima aqui apenas para explicar explicitamente como fazer o teste passar.
Alternativamente , se você não quiser desativar
FakeTimeProviderCustomization
, você pode usar outra regra de correspondência. Se seuService
construtor se parece comService(TimeProvider timeProvider)
, você pode alternativamente escrever o teste assim:Observe que o nome do parâmetro de teste
timeProvider
é o mesmo que o nome da dependência paraService
. Isso funciona mesmo se você mantiverFakeTimeProviderCustomization
active por outros motivos.Obviamente, como essas ressalvas sugerem, ambas as "soluções" são frágeis, então a melhor opção pode ser reconsiderar o design geral da API e a estratégia de testes.