具有 __init__ 属性的 Python 模拟规范

问题描述 投票:0回答:1

使用

mock.patch
在 Python 中进行测试时,如果调用类中不存在的属性,您可以使用 spec 来确保测试失败。但这些不允许您使用在
__init__
:

中创建的属性
class A(object):        
  def __init__(self):                                                                                  
    self.init_prop = 4

  def regular_prop():
    pass

with patch('__main__.A', spec=True) as A_mock:
   # accessing regular_prop on an instance of A_mock succeeds
   # accessing init_prop on an instance of A_mock raises an exception

有没有办法让

patch
或其他工具自动捕获在
__init__
中创建的属性?

python python-2.7 unit-testing
1个回答
0
投票

由于实例属性仅在实例实际实例化后创建,因此您必须创建该类的实际实例才能创建指定的模拟对象。如果实例化涉及任何外部资源,请对这些资源进行修补,以保持单元测试不受依赖关系的影响:

import sqlite3
from unittest.mock import patch

class A(object):
    def __init__(self):
        self.init_prop = sqlite3.connect('foo.db') # an external resource

with patch('sqlite3.connect'):
    a = A()

with patch('__main__.a', spec=True) as a_mock:
    print(a_mock.init_prop) # succeeds
© www.soinside.com 2019 - 2024. All rights reserved.