python - Python:如何模拟接受列表参数的调用并断言列表参数的第一项
问题描述
我正在使用 python mock 并且有一个单元测试,我需要确保调用了一个函数,并且它的第一个元素是一个特定的值。考虑这个简短的例子:
import unittest
from mock import patch, ANY
class foo():
def something(self, a, b):
print a,b
class footest(unittest.TestCase):
def testany(self):
f = foo()
with patch.object(f, "something", autospec=True) as mock_something:
f.something(1, [2,3,4])
mock_something.assert_called_with(ANY, [2, ANY])
unittest.main()
当然这失败了,因为我传递了一个三元素列表而不是二元素列表。我可以通过自己检查 mock_something.calls 并拆分参数来解决这个问题,但我想知道是否存在任何内置的模拟功能,可以轻松地断言列表可以包含任意数量的 ANY?
解决方案
你可能感兴趣mock.call_args
链接:https ://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.call_args
#!/usr/bin/env python
import unittest
from mock import patch, ANY
class foo():
def something(self, a, b):
print(a, b)
class footest(unittest.TestCase):
def testany(self):
f = foo()
with patch.object(f, "something", autospec=True) as mock_something:
f.something(1, [2,3,4])
# mock_something.assert_called_with(ANY, [2, ANY])
assert mock_something.call_count == 1
received_args = mock_something.call_args.args
target_arg = received_args[1]
assert target_arg[0] == 2
print("Result of mock_something.call_args", mock_something.call_args)
print("Result of mock_something.call_args.args", mock_something.call_args.args)
unittest.main()
输出:
(venv) nponcian 2020_7Jul_14_StackOVerflowPytest$ ./script.py
Result of mock_something.call_args call(1, [2, 3, 4])
Result of mock_something.call_args.args (1, [2, 3, 4])
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
推荐阅读
- python-3.x - 在 Python 中拟合 Gamma 分布
- php - php mysql fetch 数组重复索引问题
- c# - 如何比较两个列表
- python - 如何逐行读取文件并根据使用的分隔符从每一行选择性地打印文本
- wordpress - Gatsby Wordpress ACF 图像字段返回“null”
- c# - 如何管理 systemoutofmemory 异常?
- c# - 如何从引用的 nuget 包中加载 azure 活动函数
- amazon-web-services - 域未指向我在 aws lightsail 中的静态 IP 地址
- java - 将检索到的浮点值从外部文件转换为浮点数组。使其与方法匹配
- postgresql - PostgreSQL:通过未索引的列或其他表删除更快的是什么?