我正在尝试将简单的模拟添加到我的测试中,使用具有静态字段的类来保存设置(即单例)。当我单独运行测试时,这样可以正常工作,但当它作为完整测试套件的一部分运行时会失败。
由于某种原因,全局类是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匹配但类ID不同 - 因此fake_random
是不同的......
疯狂的事情#2:当我试图在一个新项目中重现它时,我做不到。当我在项目中注释掉所有其他测试时,它仍然发生了。
知道为什么吗?
答案 0 :(得分:0)
在发布问题后一分钟找到根本原因......
在我使用的测试文件中:
from __future__ import absolute_import #I'm using python 2.7
from .mock_settings import MockSettings
在我使用的应用代码中
from full.path.to.module import MockSettings
显然结果不是同一个对象! 我仍然不明白为什么,但我发现如果我在两个模块中更改为完整路径导入,那么它按预期工作