Fixed #23289 -- Added mock as a test dependency.

This commit is contained in:
Tim Graham 2014-11-29 11:45:06 -05:00
parent 43fcf3505e
commit 82e4f956e3
6 changed files with 34 additions and 8 deletions

View File

@ -16,3 +16,12 @@ __all__ = [
'skipUnlessDBFeature', 'modify_settings', 'override_settings', 'skipUnlessDBFeature', 'modify_settings', 'override_settings',
'override_system_checks' 'override_system_checks'
] ]
# To simplify Django's test suite; not meant as a public API
try:
from unittest import mock # NOQA
except ImportError:
try:
import mock # NOQA
except ImportError:
pass

View File

@ -24,6 +24,11 @@ Running the unit tests
Quickstart Quickstart
~~~~~~~~~~ ~~~~~~~~~~
If you are on Python < 3.3, you'll first need to install a backport of the
``unittest.mock`` module that's available in Python 3.3+. See
:ref:`running-unit-tests-dependencies` for details on installing `mock`_ and
the other optional test dependencies.
Running the tests requires a Django settings module that defines the Running the tests requires a Django settings module that defines the
databases to use. To make it easy to get started, Django provides and uses a databases to use. To make it easy to get started, Django provides and uses a
sample settings module that uses the SQLite database. To run the tests: sample settings module that uses the SQLite database. To run the tests:
@ -166,6 +171,7 @@ dependencies:
* pytz_ * pytz_
* setuptools_ * setuptools_
* memcached_, plus a :ref:`supported Python binding <memcached>` * memcached_, plus a :ref:`supported Python binding <memcached>`
* mock_ (for Python < 3.3)
* gettext_ (:ref:`gettext_on_windows`) * gettext_ (:ref:`gettext_on_windows`)
* selenium_ * selenium_
* sqlparse_ * sqlparse_
@ -176,7 +182,7 @@ like so:
.. code-block:: bash .. code-block:: bash
$ pip install -r tests/requirements/py2.txt # Python 3: py3.txt $ pip install -r tests/requirements/py3.txt # Python 2: py2.txt
You can also install the database adapter(s) of your choice using You can also install the database adapter(s) of your choice using
``oracle.txt``, ``mysql.txt``, or ``postgres.txt``. ``oracle.txt``, ``mysql.txt``, or ``postgres.txt``.
@ -198,6 +204,7 @@ associated tests will be skipped.
.. _pytz: https://pypi.python.org/pypi/pytz/ .. _pytz: https://pypi.python.org/pypi/pytz/
.. _setuptools: https://pypi.python.org/pypi/setuptools/ .. _setuptools: https://pypi.python.org/pypi/setuptools/
.. _memcached: http://memcached.org/ .. _memcached: http://memcached.org/
.. _mock: https://pypi.python.org/pypi/mock
.. _gettext: http://www.gnu.org/software/gettext/manual/gettext.html .. _gettext: http://www.gnu.org/software/gettext/manual/gettext.html
.. _selenium: https://pypi.python.org/pypi/selenium .. _selenium: https://pypi.python.org/pypi/selenium
.. _sqlparse: https://pypi.python.org/pypi/sqlparse .. _sqlparse: https://pypi.python.org/pypi/sqlparse

View File

@ -1,5 +1,7 @@
To run the test suite:: To run the test suite::
$ cd tests
$ pip install -r requirements/py3.txt # or py2.txt
$ PYTHONPATH=..:$PYTHONPATH ./runtests.py $ PYTHONPATH=..:$PYTHONPATH ./runtests.py
For more information about the test suite, see For more information about the test suite, see

View File

@ -1,5 +1,7 @@
bcrypt bcrypt
docutils docutils
# move to py2.txt when dropping Python 3.2
mock
numpy numpy
Pillow Pillow
PyYAML PyYAML

View File

@ -374,6 +374,16 @@ if __name__ == "__main__":
help='Run the Selenium tests as well (if Selenium is installed)') help='Run the Selenium tests as well (if Selenium is installed)')
options = parser.parse_args() options = parser.parse_args()
# mock is a required dependency
try:
from django.test import mock # NOQA
except ImportError:
print(
"Please install test dependencies first: \n"
"$ pip install -r requirements/py%s.txt" % sys.version_info.major
)
sys.exit(1)
# Allow including a trailing slash on app_labels for tab completion convenience # Allow including a trailing slash on app_labels for tab completion convenience
options.modules = [os.path.normpath(labels) for labels in options.modules] options.modules = [os.path.normpath(labels) for labels in options.modules]

View File

@ -10,7 +10,7 @@ from django.conf import settings
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.core.management import call_command from django.core.management import call_command
from django.db.backends.dummy.base import DatabaseCreation from django.db.backends.dummy.base import DatabaseCreation
from django.test import TestCase, TransactionTestCase, skipUnlessDBFeature from django.test import TestCase, TransactionTestCase, mock, skipUnlessDBFeature
from django.test.runner import DiscoverRunner, dependency_ordered from django.test.runner import DiscoverRunner, dependency_ordered
from django.test.testcases import connections_support_transactions from django.test.testcases import connections_support_transactions
from django.utils import six from django.utils import six
@ -129,13 +129,10 @@ class DependencyOrderingTests(unittest.TestCase):
class MockTestRunner(object): class MockTestRunner(object):
invoked = False
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
pass pass
def run_tests(self, test_labels, extra_tests=None, **kwargs): MockTestRunner.run_tests = mock.Mock(return_value=[])
MockTestRunner.invoked = True
class ManageCommandTests(unittest.TestCase): class ManageCommandTests(unittest.TestCase):
@ -143,8 +140,7 @@ class ManageCommandTests(unittest.TestCase):
def test_custom_test_runner(self): def test_custom_test_runner(self):
call_command('test', 'sites', call_command('test', 'sites',
testrunner='test_runner.tests.MockTestRunner') testrunner='test_runner.tests.MockTestRunner')
self.assertTrue(MockTestRunner.invoked, MockTestRunner.run_tests.assert_called_with(('sites',))
"The custom test runner has not been invoked")
def test_bad_test_runner(self): def test_bad_test_runner(self):
with self.assertRaises(AttributeError): with self.assertRaises(AttributeError):