No momento, estou trabalhando em um projeto que gera uma tabela (entre outras coisas) com base no conteúdo de um sistema de arquivos e, por sua vez, faz algumas modificações de metadados nas coisas que encontra. A questão é: como os testes devem ser escritos em torno disso ou configurados? Existe uma maneira fácil de zombar disso? Ou devo configurar uma "caixa de areia"?
testing
unit-testing
file-handling
Kirbinator
fonte
fonte
O que há de errado em ter um sistema de arquivos "teste"?
Crie uma pasta de modelo / estrutura de diretório que tenha conteúdo suficiente para testar suas operações.
Durante a configuração do seu teste de unidade, copie esta estrutura inicial (recomendamos que você ZIP o modelo e descompacte na área de teste). Execute seus testes. Exclua tudo durante o desmonte.
O problema da zombaria é, em primeiro lugar, sistemas de arquivos, sistemas operacionais e bancos de dados que pertencem ao seu projeto, na verdade, não se qualificam como recursos externos e, em segundo lugar, zombar de chamadas de sistema de baixo nível é demorado e propenso a erros.
fonte
Esse é o tipo de coisa que você definitivamente precisa para testar a integração, pois os sistemas de arquivos do mundo real têm todo tipo de comportamento estranho (como a maneira como o Windows não permite excluir um arquivo se algum processo, incluindo o deleter, o abrir).
Portanto, a abordagem do TDD é escrever primeiro o teste de integração (o TDD, estritamente falando, não possui conceitos distintos de 'teste de unidade' e 'teste de integração'; são apenas testes). Muito provavelmente isso será suficiente; então trabalho feito, pare, vá para casa .
Caso contrário, haverá alguma complexidade interna que não será fácil de testar adequadamente organizando arquivos. Nesse caso, você simplesmente elimina essa complexidade, coloca-a em uma classe e escreve testes de unidade para essa classe . Muito provavelmente, você descobrirá que essa classe comum também é utilizável nos casos de banco de dados, arquivo xml etc.
Em nenhum caso você pegaria o núcleo fundamental do código que está escrevendo e o "zombaria" para escrever testes que serão aprovados se a unidade em teste estiver ou não errada.
fonte
'unit test' and 'integration test'; they are just tests.
acho que, realisticamente, essa será a melhor solução para o meu caso - eu realmente preciso testar as bibliotecas do sistema de arquivos que estou usando para casos extremos e como o aplicativo deve responder. Essa. Se eu mudar para uma biblioteca diferente do sistema de arquivos, não quero reescrever um monte de códigos de simulação / teste para trabalhar com a nova biblioteca, mas ter uma estrutura de pastas de teste e testes de integração tornaria isso muito mais simples.Entendo sua pergunta como "Uma maneira boa / aceita de testar uma classe que depende das operações do sistema de arquivos". Não presumo que você queira testar o sistema de arquivos do seu sistema operacional.
Para manter o esforço de 'fazer interface com as operações do sistema de arquivos e "zombar delas' ', como a resposta do @Doc Brown sugerida o menor possível, é uma boa ideia usar fluxos binários java ou leitor de texto (ou equivalente em c # ou a linguagem de programação que você está usando) em vez de usar Arquivos com nomes de arquivos diretamente na sua classe desenvolvida por tdd.
Exemplo:
Usando java, eu implementei uma classe CsvReader
Para testar, usei dados de memória como este
ou incorporar dados de teste nos recursos
Na produção, eu uso o sistema de arquivos
Dessa forma, meu CsvReader não depende do sistema de arquivos, mas de uma abstração "Reader", onde há uma implementação para o sistema de arquivos.
fonte
Crie um wrapper para as operações do sistema de arquivos. Nos testes, passe uma simulação que implemente a mesma interface que o wrapper. Na produção, passe no invólucro.
fonte