Using django.test.client to test app http requests, getting errors
Question: We're beginning to write unit tests for our API (created with the Django Rest
Framework). We decided to start off simple and use the built in unittest and
django.test.client classes. I've got the stub of a test written and it runs
just fine:

    
    
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    from __future__ import absolute_import
    import unittest
    
    # from django.test.client import Client
    
    class TestGrowth(unittest.TestCase):
        def setUp(self):
            # self.client = Client()
            pass
    
        def test_numbers_3_4(self):
            self.assertEqual(4, 4, True)
    
        def test_strings_a_3(self):
            self.assertEqual('andy', 'andy', True)
    
    
    def suite():
        suite = unittest.TestSuite()
    
        # Add test cases to suite
        suite.addTests(unittest.makeSuite(TestGrowth))
    
        return suite
    
    if __name__ == '__main__':
        # Run test suite
        unittest.TextTestRunner(verbosity=2).run(suite())
    

However as soon as I uncomment the line reading `from django.test.client
import Client` I get an error:

    
    
    Traceback (most recent call last):
      File "./AccountGrowth.py", line 8, in <module>
        from django.test.client import Client
      File "/home/vagrant/.virtualenvs/emmasocial/lib/python2.7/site-packages/django/test/__init__.py", line 5, in <module>
        from django.test.client import Client, RequestFactory
      File "/home/vagrant/.virtualenvs/emmasocial/lib/python2.7/site-packages/django/test/client.py", line 21, in <module>
        from django.db import close_connection
      File "/home/vagrant/.virtualenvs/emmasocial/lib/python2.7/site-packages/django/db/__init__.py", line 11, in <module>
        if settings.DATABASES and DEFAULT_DB_ALIAS not in settings.DATABASES:
      File "/home/vagrant/.virtualenvs/emmasocial/lib/python2.7/site-packages/django/conf/__init__.py", line 53, in __getattr__
        self._setup(name)
      File "/home/vagrant/.virtualenvs/emmasocial/lib/python2.7/site-packages/django/conf/__init__.py", line 46, in _setup
        % (desc, ENVIRONMENT_VARIABLE))
    django.core.exceptions.ImproperlyConfigured: Requested setting DATABASES, but settings are not configured.
    You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
    

We are defining DATABASES in settings.py as follows:

    
    
    if "DATABASE_URL" in os.environ:
        # Parse database configuration from $DATABASE_URL
        DATABASES = {
            'default': dj_database_url.config()
        }
    else:
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',  # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
                'NAME': 'emmasocial',                  # Or path to database file if using sqlite3.
                'USER': 'root',                        # Not used with sqlite3.
                'PASSWORD': '',                        # Not used with sqlite3.
                'HOST': '',                            # Set to empty string for localhost. Not used with sqlite3.
                'PORT': '',                            # Set to empty string for default. Not used with sqlite3.
            }
        }
    

I'm running the tests from within the vagrant shell inside `<app>/api/tests`
with the following command `python ./AccountGrowth.py`.

Can anyone shed some light on why this is happening?


Answer: You're not running the tests via Django's test runner, which sets all that up
for you. You don't need that `if __name__ == '__main__'` block or its explicit
call to `run()`, and you should run your tests via `./manage.py test`.

