- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当尝试对返回元组的方法进行单元测试并且我试图查看代码是否访问正确的元组索引时,python 尝试评估预期的调用并将其转换为字符串。
call().methodA().__getitem__(0)
最终被转换为 '().methodA'
在我的 expected_calls
断言列表中。
提供的示例代码产生输出和回溯:
expected_calls=[call().methodA(), '().methodA']
result_calls=[call().methodA(), call().methodA().__getitem__(0)]
======================================================================
ERROR: test_methodB (badMockCalls.Test_UsingToBeMocked_methods)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\dev\workspace\TestCode\src\badMockCalls.py", line 43, in test_methodB
self.assertListEqual(expected_calls, self.result_calls)
File "C:\Python33\lib\unittest\case.py", line 844, in assertListEqual
self.assertSequenceEqual(list1, list2, msg, seq_type=list)
File "C:\Python33\lib\unittest\case.py", line 764, in assertSequenceEqual
if seq1 == seq2:
File "C:\Python33\lib\unittest\mock.py", line 1927, in __eq__
first, second = other
ValueError: too many values to unpack (expected 2)
----------------------------------------------------------------------
Ran 1 test in 0.006s
FAILED (errors=1)
如何断言方法 B 正在调用 self.tbm.methodA()[0]合适吗?
示例代码(Python 3.3.2):
import unittest
from unittest.mock import call, patch
import logging
log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
_ch = logging.StreamHandler()
_ch.setLevel(logging.DEBUG)
log.addHandler(_ch)
class ToBeMocked(): # external resource that can't be changed
def methodA(self):
return (1,)
class UsingToBeMocked(): # project code
def __init__(self):
self.tbm = ToBeMocked()
def methodB(self):
value = self.tbm.methodA()[0]
return value
class Test_UsingToBeMocked_methods(unittest.TestCase):
def setUp(self):
self.patcher = patch(__name__ + '.ToBeMocked')
self.mock_ToBeMocked = self.patcher.start()
self.utbm = UsingToBeMocked()
# clear out the mock_calls list from the constructor calls
self.mock_ToBeMocked.mock_calls = []
# set result to always point to the mock_calls that we are testing
self.result_calls = self.mock_ToBeMocked.mock_calls
def tearDown(self):
self.patcher.stop()
def test_methodB(self):
self.utbm.methodB()
# make sure the correct sequence of calls is made with correct parameters
expected_calls = [call().methodA(),
call().methodA().__getitem__(0)]
log.debug('expected_calls=' + str(expected_calls))
log.debug(' result_calls=' + str(self.result_calls))
self.assertListEqual(expected_calls, self.result_calls)
if __name__ == "__main__":
unittest.main()
最佳答案
测试 mock_object.account['xxx1'].patch(body={'status': 'active'})
我不得不使用测试:
mock_object.account.__getitem__.assert_has_calls([
call('xxxx1'),
call().patch(body={'status': 'active'}),
])
我无法解释为什么会这样,这看起来很奇怪,可能是 mock 中的错误,但我一直得到这些结果并且它有效。
关于python - 如何在单元测试期间验证 Mock mock_calls 列表中的 .__getitem__() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18905026/
我正在尝试重新创建 mock_calls example这样我就可以检查预期的调用列表是否等于实际进行的调用。但是,我收到 NameError 异常,因为 name 'call' 未定义: >>> f
当尝试对返回元组的方法进行单元测试并且我试图查看代码是否访问正确的元组索引时,python 尝试评估预期的调用并将其转换为字符串。 call().methodA().__getitem__(0) 最终
通常,我关心被测系统对软件的另一部分(我在测试中模拟的)进行的确切调用,但不关心这些调用发生的顺序。 (例如,因为被模拟替换的真实其他部分的最终效果不取决于这些调用的顺序。) 换句话说,我希望我的测试
我有一个模拟对象,我想使用mock_calls检查它的调用,它是用numpy数组调用的。但问题是它会引发 ValueError,如下面的简单玩具示例所示。 >>> mocked_model_calle
我是一名优秀的程序员,十分优秀!