Question

I created custom django-admin commands

But, I don't know how to test it in standard django tests

Was it helpful?

Solution

If you're using some coverage tool it would be good to call it from the code with:

from django.core.management import call_command
from django.test import TestCase

class CommandsTestCase(TestCase):
    def test_mycommand(self):
        " Test my custom command."

        args = []
        opts = {}
        call_command('mycommand', *args, **opts)

        # Some Asserts.

OTHER TIPS

You should make your actual command script the minimum possible, so that it just calls a function elsewhere. The function can then be tested via unit tests or doctests as normal.

you can see in github.com example see here

def test_command_style(self):
    out = StringIO()
    management.call_command('dance', style='Jive', stdout=out)
    self.assertEquals(out.getvalue(),
        "I don't feel like dancing Jive.")

A simple alternative to parsing stdout is to make your management command exit with an error code if it doesn't run successfully, for example using sys.exit(1).

You can catch this in a test with:

    with self.assertRaises(SystemExit):
        call_command('mycommand')

I agree with Daniel that the actual command script should do the minimum possible but you can also test it directly in a Django unit test using os.popen4.

From within your unit test you can have a command like

fin, fout = os.popen4('python manage.py yourcommand')
result = fout.read()

You can then analyze the contents of result to test whether your Django command was successful.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top