Python 在模拟属性时,如何在unittests中捕获sdk更改
我正在为我正在开发的api客户机使用一组单元测试中的voidspace库。我刚刚遇到了一个问题,API发生了更改(sdk上的一个属性被重命名),而我在测试中使用的sdk的模拟版本没有发现这个问题(我希望在模拟sdk上不存在的属性和方法时,它们会失败)。我正在重写测试以使用Python 在模拟属性时,如何在unittests中捕获sdk更改,python,unit-testing,mocking,Python,Unit Testing,Mocking,我正在为我正在开发的api客户机使用一组单元测试中的voidspace库。我刚刚遇到了一个问题,API发生了更改(sdk上的一个属性被重命名),而我在测试中使用的sdk的模拟版本没有发现这个问题(我希望在模拟sdk上不存在的属性和方法时,它们会失败)。我正在重写测试以使用spec\u set,但我似乎无法让它们正常工作 如果我有一个类MyItemClass,它有一个属性name和一个方法run,我如何模拟它,如果在sdk中重命名了一个属性或方法,我将在unittest中获取它 MyItemCla
spec\u set
,但我似乎无法让它们正常工作
如果我有一个类MyItemClass
,它有一个属性name
和一个方法run
,我如何模拟它,如果在sdk中重命名了一个属性或方法,我将在unittest中获取它
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)
但这并没有在属性name
的MyItemClass
中拾取重命名为item\u name
,它只是进行模拟(因此测试通过)
同样,这段代码(由于PropertyMock的存储方式,文档说您不应该这么做):
似乎选择了重命名(当设置了
name
时会失败),但当命名被修复时,模拟似乎不会以与以前相同的方式工作(测试开始失败,因为属性没有返回测试预期的结果,可能是因为删除了type()
).这看起来像是python模拟库中的一个bug或缺少的功能。我提出了与A相同的问题,在添加此功能之前,我最初的解决方法是最好的答案:
我使用以下代码解决此问题:
def add_property(mock_object, property_name, property_value) :
prop = mock.PropertyMock(return_value=property_value)
setattr(type(mock_object), property_name, prop)
# this catches sdk changes if spec_set is used with the MagicMock as
# it will fail if you assign the property to an non-existant attribute
mock_object.attach_mock(prop, property_name)
mock_item = mock.MagicMock(spec_set=sdk.MyItemClass)
add_property(mock_item, 'name', "Item title")
如果属性name
被删除或重命名,则asadd\u属性
将在附加\u模拟中失败,然后根据需要中断单元测试
def add_property(mock_object, property_name, property_value) :
prop = mock.PropertyMock(return_value=property_value)
setattr(type(mock_object), property_name, prop)
# this catches sdk changes if spec_set is used with the MagicMock as
# it will fail if you assign the property to an non-existant attribute
mock_object.attach_mock(prop, property_name)
mock_item = mock.MagicMock(spec_set=sdk.MyItemClass)
add_property(mock_item, 'name', "Item title")