...
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
[DependsOn( typeof(AppModule), typeof(TnfTestBaseModule))] public class NSubstituteAppTestModule : TnfModule { public override void PreInitialize() { // Mock repositories Configuration.ReplaceService<IWhiteHouseRepository>(() => { var instance = Substitute.For<IWhiteHouseRepository>(); var presidentToInsert = new PresidentDto("1", "New President", "55833479"); instance.InsertPresidentsAsync(Arg.Any<List<PresidentDto>>) .Returns(Task.FromResult(presidentToInsert)); IocManager.IocContainer.Register( Component .For<IWhiteHouseRepository>() .Instance(instance) .LifestyleTransient() ); }); } public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } } |
O modulo "NSubstituteAppTestModule" foi criado no projeto de testes para carregar toda a estrutura de sua aplicação para o teste integrado.
Note que o atributo do modulo "DependsOn" tem como referencia outro modulo chamado "AppModule". Este modulo é um modulo da , carregando a camada de aplicação concreta a ser testada. Esse modulo também contém dependências de outras camadas como domínio e infraestrutura onde estão definidos nossos repositórios de dados.
Também temos como dependência o modulo "TnfTestBaseModule" do TNF carregando toda para carregar a estrutura de testes integrados.
O código exemplificado acima, carrega o modulo da camada a ser testada, configurando no método "PreInitialize" com os objetos de mock. No nosso exemplo estamos mocando através da função ReplaceService do TNF usando o framework NSubstitute para criar um objeto de mock para esse repositório e registrá-lo no container de injeção de dependência.
Após a definição de nosso do módulo vamos criar a classe de Setup para cada teste integrado.Para : para isso a classe abaixo nomeada de "NSubstituteAppTestBase" realiza a herança da classe "TnfEfCoreIntegratedTestBase<Module>" que recebe um TnfModule (implementado anteriormente):
...
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public class WriteHouseAppServiceTests : NSubstituteAppTestBase
{
private readonly IWhiteHouseAppService _whiteHouseAppService;
public WriteHouseAppServiceTests()
{
_whiteHouseAppService = LocalIocManager.Resolve<IWhiteHouseAppService>();
}
[Fact]
public async Task Should_Insert_President_With_Success()
{
// Act
var response = await _whiteHouseAppService.InsertPresidentAsync(new PresidentDto("1", "New President", "12345678"));
// Assert
Assert.True(response.Success);
}
} |
...
O objeto LocalIocManager contém um wrapper que pode ser acessado para resolver toda a dependencia dependência das camadas carregadas em nosso teste através de nosso modulo que foi definido.
Com o NSubstitute criamos o objeto e então fazemos fazendo sua substituição dentro da estrutura de IoC do framework, possibilitando assim consumir nosso mock.
Assim temos o teste simulando toda a pilha de dependências do teste integrado. Cada teste executado no cenário acima será de forma reproduzido de forma isolada.
...