我遇到了一个奇怪的问题,这似乎来自 python 单元测试如何管理它们的导入以及这与模拟包的关系。这是一个 django 项目,使用 django-nose/nose 进行单元测试运行和 mock 进行模拟。
我有一个使用模拟的单元测试,单独运行时效果很好(python manage.py test tests/test_code.py)
在 test_code.py 中:
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 ...
在 bookstore.py 里面:
from my.app.proxies import BookProxy
def create_from_proxy( self, id ):
proxy = BookProxy(id)
...
但是,当我将此测试作为整个测试套件的一部分(python manage.py test)运行时,测试会失败,因为 bookstore.py 代码没有注入模拟类并回退到 BookProxy 的实际代码。
因此,当所有测试一起运行时,似乎有一些状态正在发生,但我无法弄清楚是什么导致模拟注入失败。其他使用模拟的单元测试似乎都在自行清理(使用装饰器、上下文或我在这里展示的显式补丁对象方法)。
以前见过这样的东西吗?