- August 17, 2010
- 1 (after 1 ratings)
Because BaseCommand catches all CommandError exceptions and turns them into nicely formatted strings before calling sys.exit(1), it can be tricky to properly test failure.
Normally, this is great, but it makes testing that a command fails when we expect to a little harder. That's where this snippet comes in. It redirects sys.stderr to an instance StringIO where we can monitor what's output and catches the BaseException raised by sys.exit(1). Form here, it's trivial to test that a management command fails exactly as you'd expect it to.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
import cStrinIO import sys from django.test import TestCase class MyCommandTestCase(TestCase): def test_mycommand_failure(self): old_stderr = sys.stderr sys.stderr = cStringIO.StringIO() self.assertRaises(BaseException, management.call_command, 'mycommand') self.assertTrue('Error: Some error condition here' in sys.stderr.getvalue()) sys.stderr = old_stderr
More like this
- Forcing unit test runner to abort after failed test by simonbun 7 years, 11 months ago
- Fail Faster: unsafe_test Management Command by majgis 2 years, 8 months ago
- Variable._resolve_lookup monkeypatch by showell 5 years, 5 months ago
- Stop tests at the first failure by akaihola 7 years, 3 months ago
- Continuous Integration command by berto 5 years, 6 months ago