2015-09-08 38 views
2

我想测试一个方法,它内部创建另一个类的实例,我试图嘲笑内部类的创建......这不适合我。我试图将问题复制到一个简化的案例 - 仍然没有去。这里是简化的情况:Python @patch不工作

我有一个名为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()) 

提前致谢!

回答

4

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

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

看起来不对。无论如何,我试过 - 得到了'ImportError:没有名为goo的模块' –

+0

我不确定它是否需要'pymock'作为'well。 – chepner

+0

与'pymock'一起工作。谢谢!你能解释为什么这是语法吗? –

1

基本上它是如何导入函数/类。在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