带有__init__属性的Python模型规范

Kat*_*Kat 5 python unit-testing python-2.7

使用Python进行mock.patch测试时,如果调用了类中没有的属性,则可以使用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
Run Code Online (Sandbox Code Playgroud)

有没有办法让patch或其他工具自动捕获创建的属性__init__

blh*_*ing 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
Run Code Online (Sandbox Code Playgroud)