Python@patch不工作

Python@patch不工作,python,unit-testing,mocking,Python,Unit Testing,Mocking,我试图测试一个方法,它在其中创建另一个类的实例,我试图模拟内部类的创建。。。这对我不起作用。我试图将问题复制到一个简化的案例中,但仍然没有成功。以下是简化的案例: 我有一个名为pymock的目录,其中有一个\uuuu init\uuuu.py。除此之外,还有以下3个文件: foo.py #!/usr/bin/python class Foo(object): def foo1(self): return 1 #!/usr/bin/python from foo impo

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

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

foo.py

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


class Goo(object):
    def goo1(self):
        f = Foo()
        return f.foo1()
#!/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())
goo.py

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


class Goo(object):
    def goo1(self):
        f = Foo()
        return f.foo1()
#!/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())
goo_test.py

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


class Goo(object):
    def goo1(self):
        f = Foo()
        return f.foo1()
#!/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())
提前谢谢

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

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

基本上,这就是导入函数/类的方式。在
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

似乎不正确。不管怎样,我试过了-得到了
importorror:没有名为goo的模块
我不确定它是否也需要
pymock
,好的
pymock
它可以工作。谢谢你能解释一下为什么是这种语法吗?
mock.patch
替换名称所指的对象,
pymock.foo.foo
是测试模块用来访问该函数的名称。Python没有真正的全局变量;
goo
模块有它自己的函数所使用的对
foo.foo
的引用,因此这是您需要修补的名称。哦,天哪,我被困在这个问题上一天了,这帮我点击了它-不要修补方法的源代码:
@patch('djang.some.lib.get_template')
-修补它被使用的地方
@patch('my_project.email.get_template')
。游戏规则改变者。