gpt4 book ai didi

python - 当生产类构造函数采用额外参数时,为什么 unittest.mock 会失败?

转载 作者:太空狗 更新时间:2023-10-30 02:41:57 25 4
gpt4 key购买 nike

我遇到了一个问题,我认为它可能是我正在使用的库的错误。但是,我对 python、unittest 和 unittest.mock 库还很陌生,所以这可能只是我理解上的一个漏洞。

在向一些生产代码添加测试时我遇到了错误,我制作了一个最小的示例来重现该问题:

import unittest
import mock

class noCtorArg:
def __init__(self):
pass
def okFunc(self):
raise NotImplemented


class withCtorArg:
def __init__(self,obj):
pass
def notOkFunc(self):
raise NotImplemented
def okWithArgFunc(self, anArgForMe):
raise NotImplemented

class BasicTestSuite(unittest.TestCase):
"""Basic test Cases."""

# passes
def test_noCtorArg_okFunc(self):
mockSUT = mock.MagicMock(spec=noCtorArg)
mockSUT.okFunc()
mockSUT.assert_has_calls([mock.call.okFunc()])

# passes
def test_withCtorArg_okWithArgFuncTest(self):
mockSUT = mock.MagicMock(spec=withCtorArg)
mockSUT.okWithArgFunc("testing")
mockSUT.assert_has_calls([mock.call.okWithArgFunc("testing")])

# fails
def test_withCtorArg_doNotOkFuncTest(self):
mockSUT = mock.MagicMock(spec=withCtorArg)
mockSUT.notOkFunc()
mockSUT.assert_has_calls([mock.call.notOkFunc()])


if __name__ == '__main__':
unittest.main()

我如何运行测试,输出如下:

E:\work>python -m unittest testCopyFuncWithMock
.F.
======================================================================
FAIL: test_withCtorArg_doNotOkFuncTest (testCopyFuncWithMock.BasicTestSuite)
----------------------------------------------------------------------
Traceback (most recent call last):
File "testCopyFuncWithMock.py", line 38, in test_withCtorArg_doNotOkFuncTest
mockSUT.assert_has_calls([mock.call.notOkFunc()])
File "C:\Python27\lib\site-packages\mock\mock.py", line 969, in assert_has_calls
), cause)
File "C:\Python27\lib\site-packages\six.py", line 718, in raise_from
raise value
AssertionError: Calls not found.
Expected: [call.notOkFunc()]
Actual: [call.notOkFunc()]

----------------------------------------------------------------------
Ran 3 tests in 0.004s

FAILED (failures=1)

我正在使用 python 2.7.11,通过 pip 安装模拟版本 2.0.0。

对我做错了什么有什么建议吗?或者这看起来像是库中的错误?

最佳答案

有趣的是,您选择执行断言的方式掩盖了您的问题。

尝试,而不是这个:

mockSUT.assert_has_calls(calls=[mock.call.notOkFunc()])

这样做:

mockSUT.assert_has_calls(calls=[mock.call.notOkFunc()], any_order=True)

您会看到实际的异常:

TypeError("'obj' parameter lacking default value")

这是因为您试图实例化类 withCtorArg 的实例,该类的参数 obj 没有默认值。如果您尝试直接实际实例化它,您会看到:

TypeError: __init__() takes exactly 2 arguments (1 given)

但是,由于您让 mock 库处理 mock 对象的实例化,因此错误发生在那里 - 并且您得到 TypeError 异常。

修改相关类:

class withCtorArg:
def __init__(self, obj = None):
pass
def notOkFunc(self):
pass
def okWithArgFunc(self, anArgForMe):
pass

并为 obj 添加一个默认的 None 值可以解决这个问题。

关于python - 当生产类构造函数采用额外参数时,为什么 unittest.mock 会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37923265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com