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')
。游戏规则改变者。