我有两个类: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