0

我正在为我正在开发的 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将属性重命名nameitem_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())。

4

1 回答 1

0

这看起来像是 python 模拟库中的一个错误或缺失的功能。我提出了与问题相同的问题在添加此功能之前,我最初的解决方法是最佳答案:

我使用以下代码解决它:

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")

如果属性被删除或重命名,asadd_property将在 attach_mock 中失败,然后根据需要中断单元测试。name

于 2013-11-18T15:42:42.157 回答