【问题标题】:How do I catch sdk changes in my unittests when mocking properties模拟属性时如何在单元测试中捕获 sdk 更改
【发布时间】:2013-11-13 17:41:33
【问题描述】:

我正在为我正在开发的 api 客户端的一组单元测试中使用 voidspace mock 库。我刚刚遇到了一个问题,API 发生了变化(并且 sdk 上的一个属性被重命名)并且我在测试中使用的 sdk 的模拟版本没有选择这个(我希望它们在我尝试模拟时失败模拟的 sdk 上不存在该属性和方法)。我正在重写测试以使用spec_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)

但这并没有将属性nameMyItemClass 重命名为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()的删除)。

【问题讨论】:

    标签: python unit-testing mocking


    【解决方案1】:

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

    我使用以下代码解决它:

    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 被删除或重命名,add_property 将在 attach_mock 中失败,然后根据需要中断单元测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2020-01-18
      • 2017-10-29
      • 2014-11-01
      • 2017-06-14
      • 2020-09-05
      • 1970-01-01
      相关资源
      最近更新 更多