Запустите команду управления Python / Django из UnitTest / WebTest - PullRequest
19 голосов
/ 02 марта 2012

У нас есть несколько команд на нашем сайте Django, некоторые из которых являются административными, а некоторые работают на заданиях cron, которые я не могу понять, как тестировать.Они выглядят примерно так:

# Saved in file /app/management/commands/some_command.py
# Usage: python manage.py some_command
from django.core.management.base import NoArgsCommand
class Command(NoArgsCommand):
    def handle_noargs(self, **options):
         # Do something useful

И у меня есть несколько тестов, которые выглядят так:

import unittest
from django.test import TestCase
from django_webtest import WebTest

class SomeTest(WebTest):
    fixtures = ['testdata.json']

    def setUp(self):
        self.open_in_browser = False
        # Set up some objects

    def test_registration(self):
        response = self.client.get('/register/')
        self.assertEqual(response.status_code, 200)
        form = self.app.get('/register/').forms[1]
        # Set up the form
        response = form.submit()
        self.assertContains(response, 'You are Registered.')
        if self.open_in_browser:
            response.showbrowser()

        # Here I'd like to run some_command to see the how it affects my new user.

В моем тесте (где у меня есть комментарий) я бы хотелзапустить мой NoArgsCommand, чтобы увидеть, что происходит с моим новым пользователем.Я не могу найти документацию или примеры о том, как это сделать.Также обратите внимание, что моей тестовой средой является БД SQLlite, которую я создаю с нуля в памяти, загружаю некоторые приборы и объекты и запускаю свои тесты, настолько, насколько я хотел бы настроить данные в реальной БД, а затем просто запустить мойКоманда из командной строки, я не могу, это слишком много времени.Любые идеи будут с благодарностью.

1 Ответ

49 голосов
/ 02 марта 2012

Документация Django по командам управления может помочь, она описывает, как вызывать их из кода Python.

В основном вам нужно что-то вроде этого:

from django.core import management
management.call_command( ... )
...