Python @patch无效

时间:2015-09-08 15:16:27

标签: python unit-testing mocking

我正在尝试测试一个方法,在其中创建另一个类的实例,我试图模拟内部类的创建......这对我不起作用。我尝试将问题复制到一个简化的案例 - 但仍然没有去。以下是简化案例:

我有一个名为pymock的目录,其中包含__init__.py。除此之外,还有以下3个文件:

foo.py

#!/usr/bin/python
class Foo(object):
    def foo1(self):
        return 1

goo.py

#!/usr/bin/python
from foo import Foo


class Goo(object):
    def goo1(self):
        f = Foo()
        return f.foo1()

goo_test.py

#!/usr/bin/python
from mock import patch, Mock
from nose.tools import assert_equal

from goo import Goo


class TestGoo(object):
    def setup(self):
        self.goo = Goo()

    @patch('pymock.foo.Foo', autospec=True)
    def test_goo1(self, foo1_mock):
        foo_instance = Mock()
        foo1_mock.return_value = foo_instance
        foo_instance.foo1.return_value = 11
        assert_equal(11, self.goo.goo1())

提前致谢!

2 个答案:

答案 0 :(得分:8)

您需要修补goo正在使用的名称

@patch('pymock.goo.Foo', autospec=True)

答案 1 :(得分:2)

基本上它是如何导入函数/类的。在goo.py您已直接导入Foo。因此goo.py拥有自己对Foo的引用,因此您的补丁必须是: @patch('pymock.goo.Foo', autospec=True)

但如果goo.py看起来像这样:

#!/usr/bin/python
import foo


class Goo(object):
    def goo1(self):
        f = foo.Foo()
        return f.foo1()

您的问题中的补丁可以使用,因为goo.py没有直接引用Foo