相关疑难解决方法(0)

修补类在访问实例属性时会产生"AttributeError:Mock对象没有属性"

问题
使用mock.patchautospec=True修补一类不保存该类的实例的属性.

细节
我试图测试一个类Bar,它将类的实例实例Foo化为一个Bar被调用的对象属性foo.所述Bar被测方法被调用bar; 它调用属于fooFoo实例的方法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)

python attributes unit-testing mocking python-unittest

34
推荐指数
1
解决办法
3万
查看次数

使用unittest.mock.patch时,为什么默认情况下autospec不为True?

使用mock修补函数时,可以选择将autospec指定为True:

如果设置autospec = True,则使用要替换的对象的规范创建模拟.mock的所有属性也将具有要替换的对象的相应属性的规范.被模拟的方法和函数将检查其参数,如果使用错误的签名调用它们将引发TypeError.

(http://www.voidspace.org.uk/python/mock/patch.html)

我想知道为什么这不是默认行为?当然,我们几乎总是希望将错误的参数传递给我们修补的任何函数?

python unit-testing mocking

27
推荐指数
3
解决办法
9599
查看次数