python - 从不同的python模块访问全局变量意外失败
问题描述
我正在尝试向我的测试添加简单的模拟,使用带有静态字段的类来保存设置(即单例)。当我单独运行测试时这很好用,但当它作为完整测试套装的一部分运行时会失败。
由于某种原因,全局类是 tests.py 模块和测试代码之间的不同对象(尽管是相同的过程)。
IE。这是一个简化的例子:
# 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 匹配但类 id 是不同的 - 因此fake_random
是不同的......
疯狂的事情#2:当我试图在一个新项目中重现它时,我做不到。当我注释掉我项目中的所有其他测试时,它仍然发生了。
知道为什么吗?
解决方案
发布问题后一分钟找到根本原因......
在我使用的测试文件中:
from __future__ import absolute_import #I'm using python 2.7
from .mock_settings import MockSettings
在我使用的应用程序代码中
from full.path.to.module import MockSettings
显然结果不是同一个对象!我仍然不明白为什么,但我发现如果我在两个模块中都更改为完整路径导入,那么它会按预期工作
推荐阅读
- python-3.x - time.perf_counter() 和 time.process_time() 有什么区别?
- django - 如何使可点击的链接将项目添加到列表中?
- java - Java中的PrintService一旦托管在heroku中就无法工作
- python - 实时获取while循环中的值
- audio - 录制音频时采样率无效
- jpa - EclipseLink (JPA) 基于表的多租户与 JTA,如何?
- javascript - Vue 道具更新 - 您可能在组件渲染函数中有无限更新循环
- sql - 使用 Min 变量而不分组,同时按 id 分组
- javascript - Webpack 中的多条目
- bash - 将与模式匹配的最后一个文件的名称保存到 bash 中的变量