Inicializando o MEDIA_ROOT antes de cada teste do Django

Eu quero meus testes do Django para criar e modificar arquivos de mídia. Então, assim como os testes do Django fazem com bancos de dados, eu quero configurar uma pasta MEDIA_ROOT vazia antes de cada teste ser executado.

Eu pensei em criar uma pasta temporária e apontar MEDIA_ROOT para ela. No entanto, não consigo descobrir onde colocar o código que faz isso. Neste exemplo , um Runner especial é criado. O corredor configura a raiz da mídia e a derruba.

Infelizmente, setup_test_environment é chamado uma vez antes da primeira function de teste ser executada, e não toda vez que um teste é executado.

Eu tentei criar uma class FileSystemTestCase que configura o sistema de arquivos em sua function setUp e ter todos os meus casos de teste derivam dele. Embora isso funcione, é necessário que todas as pessoas que escrevem um testcase lembrem-se de chamar meu método setUp , pois ele não é chamado automaticamente.

Normalmente, eu não me incomodaria com isso, mas o custo de esquecer de chamar o método setUp pai pode ser muito alto – se alguém esquecer a chamada e os testes forem acidentalmente executados em um sistema ativo, coisas ruins acontecerão.

EDIT: A solução temporária que encontrei foi implementar meu próprio runner e um TestCase base. Ambos configuram um MEDIA_ROOT temporário, portanto, se alguém esquecer de chamar meu método setUp , o teste será executado na pasta temporária do teste anterior, ou no configurado pelo executor. Isso pode causar falhas nos testes, mas não arruinará os dados ao vivo.

Eu estou esperando por uma solução mais elegante.

Parece-me que você está tentando resolver dois problemas separados:

  1. Permitir que os testes sejam executados de forma independente (com relação ao MEDIA_ROOT ) quando os testadores fazem a coisa certa (ou seja, herdar da sua class de teste e chamar o setUp() ).
  2. Evite que os testadores estraguem dados reais quando acidentalmente fazem a coisa errada.

Dado isso, acho que uma abordagem em duas frentes faz sentido. Seu setUp() resolve o problema 1. Configurar MEDIA_ROOT no MEDIA_ROOT testes, no entanto, esconde o fato de que seus testadores fizeram a coisa errada. Em vez disso, eu me concentraria apenas em proteger os dados: por exemplo, você poderia definir MEDIA_ROOT como None . Isso protegeria os dados reais no MEDIA_ROOT ; torne mais provável que o testador veja um erro se não usar seu setUp() ; e reduzir a duplicação de código.

Uma abordagem mais robusta seria escrever seu próprio executor de testes que faz a configuração antes de cada teste (modelado após o modo como o Django lida com o database), mas isso pode ser um exagero para suas necessidades.