У меня есть метод, который принимает аргументы по умолчанию:
def build_url(endpoint, host=settings.DEFAULT_HOST):
return '{}{}'.format(host, endpoint)
У меня есть тестовый пример, который использует этот метод:
class BuildUrlTestCase(TestCase):
def test_build_url(self):
""" If host and endpoint are supplied result should be 'host/endpoint' """
result = build_url('/end', 'host')
expected = 'host/end'
self.assertEqual(result,expected)
@patch('myapp.settings')
def test_build_url_with_default(self, mock_settings):
""" If only endpoint is supplied should default to settings"""
mock_settings.DEFAULT_HOST = 'domain'
result = build_url('/end')
expected = 'domain/end'
self.assertEqual(result,expected)
Если я удалю точку отладки в build_url
и проверю этот атрибут, settings.DEFAULT_HOST
вернет фиктивное значение. Однако тест продолжает давать сбой, и утверждение указывает, что host
присваивается значение из моего фактического settings.py
. Я знаю, что это потому, что аргумент ключевого слова host
устанавливается во время импорта, и мой макет не рассматривается.
отладчик
(Pdb) settings
<MagicMock name='settings' id='85761744'>
(Pdb) settings.DEFAULT_HOST
'domain'
(Pdb) host
'host-from-settings.com'
Есть ли способ переопределить это значение во время тестирования, чтобы я мог использовать путь по умолчанию с издевательским объектом settings
?
myapp
. Где определяетсяbuild_url
? Вам может понадобиться что-то вроде@patch('module.myapp.settings')
, а не@patch(myapp.settings)
. - person chepner   schedule 03.06.2014settings = <magicmock blah blah
). Я предполагаю, чтоhost=settings.DEFAULT_HOST
произошло до патча. - person nsfyn55   schedule 03.06.2014def foo(x=[])
не дает вам новый пустой список каждый раз, когда вы вызываетеfoo()
). Что приводит к возможному ответу... - person chepner   schedule 03.06.2014