Python @patch无效

Uri*_*lit 9 python unit-testing mocking

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

我有一个新的目录pymock__init__.py它.除此之外,还有以下3个文件:

foo.py

#!/usr/bin/python
class Foo(object):
    def foo1(self):
        return 1
Run Code Online (Sandbox Code Playgroud)

goo.py

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


class Goo(object):
    def goo1(self):
        f = Foo()
        return f.foo1()
Run Code Online (Sandbox Code Playgroud)

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())
Run Code Online (Sandbox Code Playgroud)

提前致谢!

che*_*ner 9

你需要修补的名字goo正在使用.

@patch('pymock.goo.Foo', autospec=True)
Run Code Online (Sandbox Code Playgroud)

  • `mock.patch`替换名称所指的对象,而`pymock.foo.Foo`是您的* test模块*用于访问该功能的名称。Python没有真正的全局变量。goo模块具有其函数使用的对foo.Foo的引用,因此* that *是您需要修补的名称。 (2认同)
  • 噢,天哪,我被困了一天,这让我为之点击-不要修补方法的源代码:`@patch('djang.some.lib.get_template')`-使用它的地方修补` @patch('my_project.email.get_template')`。改变游戏规则的人。 (2认同)
  • @Mojowen你救了我的一天!非常感谢你 (2认同)

小智 5

基本上这就是您导入函数/类的方式。在goo.pyFoo直接导入。所以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()
Run Code Online (Sandbox Code Playgroud)

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