在一起运行所有django-nose测试时,没有注入模拟类

Jon*_*son 8 python django mocking nose django-nose

我遇到了一个奇怪的问题,似乎是由python单元测试如何管理它们的导入以及它与mock包的关系.这是一个django项目,使用django-nose/nose进行单元测试运行,并使用mock进行模拟.

我有一个使用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 ...
Run Code Online (Sandbox Code Playgroud)

在bookstore.py里面:

from my.app.proxies import BookProxy

def create_from_proxy( self, id ):
    proxy = BookProxy(id)
    ...
Run Code Online (Sandbox Code Playgroud)

但是,当我将此测试作为整个测试套件(python manage.py test)的一部分运行时,测试失败,因为bookstore.py代码没有得到注入的mock类,而是回退到BookProxy的实际代码.

因此,当所有测试一起运行时,似乎有一些有状态的事情发生,但我无法弄清楚是什么导致模拟注入失败.其他使用mock的单元测试似乎都是在他们自己之后进行清理(使用装饰器,上下文或我在这里展示的显式补丁对象方法).

之前有过类似的东西吗?