问题
使用mock.patch与autospec=True修补一类不保存该类的实例的属性.
细节
我试图测试一个类Bar,它将类的实例实例Foo化为一个Bar被调用的对象属性foo.所述Bar被测方法被调用bar; 它调用属于foo的Foo实例的方法Bar.在测试中,我在嘲笑Foo,因为我只想测试Bar访问正确的Foo成员:
import unittest
from mock import patch
class Foo(object):
def __init__(self):
self.foo = 'foo'
class Bar(object):
def __init__(self):
self.foo = Foo()
def bar(self):
return self.foo.foo
class TestBar(unittest.TestCase):
@patch('foo.Foo', autospec=True)
def test_patched(self, mock_Foo):
Bar().bar()
def test_unpatched(self):
assert Bar().bar() == 'foo'
Run Code Online (Sandbox Code Playgroud)
类和方法工作得很好(test_unpatched通过),但是当我尝试在测试用例(使用nosetests和pytest测试)中使用Foo时autospec=True,遇到"AttributeError:Mock对象没有属性'foo'"
19:39 $ nosetests -sv …Run Code Online (Sandbox Code Playgroud) 使用mock修补函数时,可以选择将autospec指定为True:
如果设置autospec = True,则使用要替换的对象的规范创建模拟.mock的所有属性也将具有要替换的对象的相应属性的规范.被模拟的方法和函数将检查其参数,如果使用错误的签名调用它们将引发TypeError.
(http://www.voidspace.org.uk/python/mock/patch.html)
我想知道为什么这不是默认行为?当然,我们几乎总是希望将错误的参数传递给我们修补的任何函数?