Estou escrevendo um componente que, dado um arquivo ZIP, precisa:
- Descompacte o arquivo.
- Encontre uma dll específica entre os arquivos descompactados.
- Carregue essa dll através da reflexão e invoque um método nela.
Eu gostaria de testar este componente.
Estou tentado a escrever código que lida diretamente com o sistema de arquivos:
void DoIt()
{
Zip.Unzip(theZipFile, "C:\\foo\\Unzipped");
System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar");
myDll.InvokeSomeSpecialMethod();
}
Mas as pessoas costumam dizer: "Não escreva testes de unidade que dependem do sistema de arquivos, banco de dados, rede etc."
Se eu escrevesse isso de uma maneira amigável para teste de unidade, suponho que ficaria assim:
void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
string path = zipper.Unzip(theZipFile);
IFakeFile file = fileSystem.Open(path);
runner.Run(file);
}
Yay! Agora é testável; Eu posso alimentar testes duplos (zombes) para o método DoIt. Mas a que custo? Agora eu tive que definir três novas interfaces apenas para tornar isso testável. E o que exatamente estou testando? Estou testando se minha função DoIt interage corretamente com suas dependências. Não testa se o arquivo zip foi descompactado corretamente etc.
Parece que não estou mais testando a funcionalidade. Parece que estou apenas testando interações de classe.
Minha pergunta é a seguinte : qual é a maneira correta de testar algo que depende do sistema de arquivos?
edit Estou usando o .NET, mas o conceito também pode aplicar código nativo ou Java.
myDll.InvokeSomeSpecialMethod();
onde você verificaria se ele funciona corretamente em situações de sucesso e falha, para que eu não fizesse teste de unidade, DoIt
mas DllRunner.Run
que disse usar mal um teste UNIT para verificar se todo o processo funciona. um uso indevido aceitável e, como seria um teste de integração que oculta um teste de unidade, as regras normais de teste de unidade não precisam ser aplicadas estritamente