【发布时间】:2017-07-05 18:58:11
【问题描述】:
假设我有一个如下声明的类:
class SampleClass(object):
def __init__(self):
self.ops = {
'key 1': self.function_a,
'key 2': self.function_b
}
def function_a(self):
print('Inside a')
def function_b(self):
print('Inside b')
def main(self, key):
self.ops[key]()
根据我得到的密钥,我选择并执行这两个函数中的任何一个。
我正在尝试对主要功能进行单元测试,但我无法修补 function_a 或 function_b。
我正在一个名为 test.py 的单独文件中编写单元测试。
当我尝试用:修补 function_a 时:
self.sampleclass = SampleClass()
with patch.object(SampleClass, 'function_a', return_value=None) as test_function:
self.sampleclass.main('key1')
控制进入function_a 并打印Inside a。
如何模拟从函数字典调用的函数?
【问题讨论】:
-
那个例子行不通。但如果是这样,我不会模拟那些也是被测类的一部分的方法。它们是有效的实现细节,通过调用
main对其进行测试,并确保您从真实方法中获得预期值。 -
@jonrsharpe 我在函数字典中的函数之前错过了 self 关键字。现在更正了。该代码现在可以工作了。但是我无法在不调用 function_a 的情况下对主函数进行单元测试。对我来说 function_a 是一个需要身份验证和其他东西的 API,所以我宁愿不调用它。
-
可以依次模拟
function_a(其实是方法)调用的东西;在这种情况下,嘲笑print就可以了。例如,如果您使用requests从它发出 API 请求,请查看responses库。但是不要模拟方法本身;单位是SampleClass,而不是单独的main方法。
标签: python python-2.7 unit-testing mocking