我正在为我正在开发的 api 客户端的一组单元测试中使用 voidspace模拟库。我刚刚遇到了一个问题,其中 API 发生了变化(并且 sdk 上的一个属性被重命名)并且我在测试中使用的 sdk 的模拟版本没有选择这个(我希望它们在我尝试模拟时失败模拟的 sdk 上不存在该属性和方法)。我正在重写要使用的测试,spec_set
但我似乎无法让它们工作。
如果我有一个MyItemClass
带有属性name
和方法的类,run
我该如何模拟它,如果属性或方法在 sdk 中被重命名,我会在单元测试中将其拾取。
MyItemClass
位于:
class MyItemClass:
...
@property
def name(self):
return self._details.name
def run(self):
... do something ...
return result
目前我正在尝试:
mock_item = mock.MagicMock(spec_set=sdk.MyItemClass)
type(mock_item).name = mock.PropertyMock(return_value="Item title")
mock_item.run = mock.MagicMock(return_value=foobar)
但这并没有MyItemClass
将属性重命名name
为item_name
,它只是进行模拟(因此测试通过)。
同样,此代码(由于 PropertyMocks 的存储方式,文档说您不应该这样做):
mock_item = mock.MagicMock(spec_set=sdk.MyItemClass)
mock_item.name = mock.PropertyMock(return_value="Item title")
mock_item.run = mock.MagicMock(return_value=foobar)
似乎选择了重命名(并且在name
设置时失败),但是当命名被修复时,模拟似乎不像以前那样工作(测试开始失败,因为属性没有返回测试所期望的,大概是因为的下降type()
)。