Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 同时运行所有django nose测试时未注入模拟类_Python_Django_Mocking_Nose_Django Nose - Fatal编程技术网

Python 同时运行所有django nose测试时未注入模拟类

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

我遇到了一个奇怪的问题,它似乎是由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 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(或者是直鼻型)中的包加载对于许多测试与单独的测试是不同的,但我不能在这里支持我的说法。我有类似的问题,这个答案帮助了我: