Eu quero escrever um teste de unidade para um comando Django manage.py que faz uma operação de back-end em uma tabela de banco de dados. Como eu chamaria o comando de gerenciamento diretamente do código?
Não quero executar o comando no shell do sistema operacional a partir de tests.py porque não posso usar o ambiente de teste configurado usando o manage.py test (banco de dados de teste, caixa de saída de email fictícia de teste, etc ...)
fonte
call_command('check')
, para garantir que as verificações do sistema sejam aprovadas em um teste.Em vez de executar o truque call_command, você pode executar sua tarefa executando:
fonte
call_command
precisa que o aplicativo testado seja carregadoINSTALLED_APPS
. Entre ter que carregar o aplicativo apenas para fins de teste e usar isso, eu escolhi isso.call_command
é provavelmente o que a maioria das pessoas deve tentar primeiro. Esta resposta me ajudou a solucionar um problema em que eu precisava passar nomes de tabelas unicode para oinspectdb
comando. python / bash estava interpretando argumentos da linha de comando como ascii, e isso estava bombardeando aget_table_description
chamada profundamente no django.o seguinte código:
... é igual aos seguintes comandos digitados no terminal:
Veja executando comandos de gerenciamento no django docs .
fonte
A documentação do Django no call_command falha ao mencionar que
out
deve ser redirecionada parasys.stdout
. O código de exemplo deve ser:fonte
Com base na resposta de Nate, tenho o seguinte:
Uso:
A vantagem aqui é que, se você usou opções adicionais e o OptParse, isso resolverá o problema. Não é perfeito - e ainda não canaliza resultados -, mas usará o banco de dados de teste. Você pode testar os efeitos do banco de dados.
Estou certo de que o uso do módulo de simulação Micheal Foords e também a reconexão do stdout durante a duração de um teste significariam que você também poderia aproveitar um pouco mais dessa técnica - teste a saída, as condições de saída etc.
fonte