我想要一个单元测试来Assert一个函数中的变量action
被设置为它的预期值,这个变量被使用的唯一时间是当它被传递到一个库的调用中时。
Class Monolith(object):
def foo(self, raw_event):
action = # ... Parse Event
# Middle of function
lib.event.Event(METADATA, action)
# Continue on to use the build event.
我的想法是,我可以模拟lib.event.Event
,并获得其输入参数,并Assert它们具有特定的值。
”这不是嘲笑的工作吗?模拟文档的不一致性、半示例性和过多的示例与我想要做的事情无关,让我感到沮丧。
4条答案
按热度按时间ajsxfq5m1#
您也可以使用
call_args
或call_args_list
。一个简单的例子如下所示:
我只是快速地为可能需要它的人写了这个例子-我还没有实际测试过这个,所以可能有小错误。
yv5phkfx2#
你可以使用补丁装饰器,然后像这样调用
assert_called_with
到模拟的对象:如果你有这样的结构:
而
example.py
的内容是:而
lib/event.py
的含量为:tests.py
的代码应该是这样的:eh57zj3b3#
如果你想直接访问参数,这个怎么样?虽然有点多余请访问https://docs.python.org/3.6/library/unittest.mock.html#unittest.mock.call.call_list
mutmk8jj4#
上面的答案很有帮助,但我想要一种简单的方法来编写一个单元测试,当测试代码改变了模拟函数调用的方式而没有任何功能更改时,不需要重构。
例如,如果我选择部分或完全通过关键字调用函数(或构建一个kwargs字典并插入),而不更改传入的值:
这可能有点过分,但我希望我的单元测试不必担心函数调用格式的更改,只要函数调用中包含预期的值(甚至包括指定或不指定默认值)。
这是我想出的解决办法。我希望这有助于简化您的测试体验:
使用方法:
请注意使用前的警告。
assert_called_with()
需要引用原始函数。如果你在单元测试中使用装饰器@unittest.mock.patch
,它可能会适得其反,因为你试图查找函数签名可能会得到模拟对象而不是原始函数:我建议使用
unittest.mock.patch.object
,它要求你导入正在打补丁的函数,因为我的代码无论如何都需要引用函数: