Python 同时运行所有django nose测试时未注入模拟类
我遇到了一个奇怪的问题,它似乎是由python单元测试如何管理其导入以及这与模拟包的关系引起的。这是针对django项目的,使用django nose/nose进行单元测试运行,使用mock进行模拟 我有一个使用mock的单元测试,它在单独运行时工作得非常好(python manage.py tests/test_code.py) 内部测试代码.py:Python 同时运行所有django nose测试时未注入模拟类,python,django,mocking,nose,django-nose,Python,Django,Mocking,Nose,Django Nose,我遇到了一个奇怪的问题,它似乎是由python单元测试如何管理其导入以及这与模拟包的关系引起的。这是针对django项目的,使用django nose/nose进行单元测试运行,使用mock进行模拟 我有一个使用mock的单元测试,它在单独运行时工作得非常好(python manage.py tests/test_code.py) 内部测试代码.py: from my.app.models.bookstore import create_from_proxy class MockTestCas
from my.app.models.bookstore import create_from_proxy
class MockTestCase( TestCase ):
def setUp( self ):
self.patcher = patch( 'my.app.models.bookstore.BookProxy', autospec=True )
self.mock_proxy = self.patcher.start()
self.proxy_instance = self.mock_proxy.return_value
self.proxy_instance.json = json.loads(BOOK_JSON)
def tearDown( self ):
self.patcher.stop()
def test_mock_works( self ):
book_id = 55
v = create_from_proxy( book_id )
self.assertTrue( self.mock_proxy.called )
... more tests ...
inside bookstore.py:
from my.app.proxies import BookProxy
def create_from_proxy( self, id ):
proxy = BookProxy(id)
...
但是,当我将此测试作为整个测试套件(python manage.py测试)的一部分运行时,测试失败,因为bookstore.py代码没有注入模拟类,而是返回BookProxy的实际代码
因此,当所有测试一起运行时,似乎有一些有状态的情况发生,但我无法找出是什么导致模拟注入失败。其他使用mock-all的单元测试似乎在自己完成之后就开始清理了(或者使用decorator、上下文,或者我在这里展示的显式补丁对象方法)
像这样的事情以前在外面见过吗 您的测试正在修补
my.app.models.bookstore.BookProxy
,但您的代码正在使用my.app.proxy导入BookProxy的。因此,您可能正在修补对象,这些对象在手动运行测试时恰好相同,但在使用manage.py
运行测试时却不相同。我还不知道该怎么做。所有的测试都是从manage.py开始运行的(我的原始问题中有命令行调用)。感觉django nose(或者是直鼻型)中的包加载对于许多测试与单独的测试是不同的,但我不能在这里支持我的说法。我有类似的问题,这个答案帮助了我: