Неожиданный сбой доступа к глобальной переменной из другого модуля Python - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь добавить простой мокинг в мои тесты, используя класс со статическими полями для хранения настроек (т. Е. Синглтон).Это прекрасно работает, когда я запускаю тест самостоятельно, но завершается неудачно, когда он запускается как часть полного набора тестов.

По какой-то причине глобальный класс является другим объектом между модулем tests.py ипроверенный код (несмотря на тот же процесс).

т.е.Вот упрощенный пример:

   # in mock_settings.py
   class MockSettings(object):
       fake_random = False

   # in views.py
   def func(request)
       print(os.getpid(), id(MockSettings))
       if MockSettings.fake_random:
           return HttpResponse('123')
       else:
           return HttpResponse(str(random.randint(1000)))


   # in tests.py
   def test_func(self):
       print(os.getpid(), id(MockSettings))
       MockSettings.fake_random = True
       response = self.client.get('/func')
       self.assertEquals(response.content, '123')  # fails when ran as test suite, works when runs alone

Сумасшедшая вещь # 1: когда я запускаю только один тест (например, ./manage.py test tests.TestClass.test_func), id(MockSettings) одинаков в файлах tests.py иviews.py, но при запуске в наборе тестов (например, ./manage.py test) pid совпадает, но идентификатор класса отличается - и, следовательно, fake_random отличается ...

Сумасшедшая вещь # 2:когда я попытался воспроизвести его в новом проекте, я не смог.Когда я прокомментировал все другие тесты в моем проекте, это все же произошло.

Есть идеи, почему?

1 Ответ

0 голосов
/ 26 мая 2018

Нашли основную причину через минуту после публикации вопроса ...

в используемом мной тестовом файле:

from __future__ import absolute_import  #I'm using python 2.7
from .mock_settings import MockSettings

, а в коде приложения я использовал

from full.path.to.module import MockSettings

Видимо результат не тот же объект!Я до сих пор не понимаю, почему, но я обнаружил, что если я перехожу на импорт полного пути в обоих модулях, то он работает как положено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...