如何从不可调用的规范创建可调用的mock ?



我有两个类:classOne它做一些事情,类Wrapper翻译One的API. 测试包装器我想模拟类One. 我的问题是One在它的__init__方法中设置了许多属性,我希望我的测试在One中更改这些属性时抛出错误(例如重命名或删除)。但在Wrapper中没有.

我试图初始化One的实例并将其用作spec,但结果mock是不可调用的:

from unittest import mock
import pytest
class One:
def __init__(self, a):
self.a = a
spec_obj = One(a='foo')
# working code, the test should pass
class Wrapper:
def __init__(self, wa):
self._one = One(a=wa)
self.wa = self._one.a
@mock.patch(__name__ + '.One', autospec=spec_obj)
def test_wrapper(MockOne):
MockOne.return_value.a = test_a = 'bar'

wrapper_obj = Wrapper(wa=test_a)
MockOne.assert_called_once_with(a=test_a)
assert wrapper_obj.wa == test_a

抛出错误:

TypeError: 'NonCallableMagicMock' object is not callable

因为规格spec_obj是不可调用的。

如果我设置autospec=True,一切工作,但测试通过,即使当One的

MockOne.return_value生成您配置的Mock,但是当实际调用mock时,您会得到一个未正确配置的不同的Mock。需要直接配置MockOne.return_value

@mock.patch('One', autospec=True)
def test_wrapper(MockOne):
MockOne.return_value.a = test_a = 'bar'

wrapper_obj = Wrapper(wa=test_a)
MockOne.assert_called_once_with(a=test_a)
assert wrapper_obj.wa == test_a

最新更新