commadelimited
commadelimited

Reputation: 5119

Using django.test.client to test app http requests, getting errors

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?

Upvotes: 3

Views: 568

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599630

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.

Upvotes: 1

Related Questions