Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在模拟属性时,如何在unittests中捕获sdk更改_Python_Unit Testing_Mocking - Fatal编程技术网

Python 在模拟属性时,如何在unittests中捕获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

我正在为我正在开发的api客户机使用一组单元测试中的voidspace库。我刚刚遇到了一个问题,API发生了更改(sdk上的一个属性被重命名),而我在测试中使用的sdk的模拟版本没有发现这个问题(我希望在模拟sdk上不存在的属性和方法时,它们会失败)。我正在重写测试以使用
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
被删除或重命名,则as
add\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")