【发布时间】:2021-08-14 15:30:06
【问题描述】:
我有以下玩具类:
class MyClass:
def __init__(self, x):
self.x = x
def get_operator(self):
answer = input("Multiply? ")
if answer == "y":
return "multiply"
def multiply(self, y):
if self.get_operator() == "multiply":
return self.x * y
下面的测试(使用pytest)会报错:
def test_multiply_is_called(mocker):
multiply = mocker.patch("package.module.MyClass.multiply", return_value=1, autospec=True)
my_instance = MyClass(2)
my_instance.multiply(3)
multiply.assert_called_once() # no error whatever autospec is equal to (True or False)
multiply.assert_called_with(3) # no error only if autospec=False
TypeError: Can't use 'autospec' with create=True
在尝试模拟 Python 内置函数 input 时变得更加不清晰:
def test_input_is_called_once(mocker):
input = mocker.patch("package.module.input", return_value="y", autospec=True)
my_instance = MyClass(2)
my_instance.get_operator()
input.assert_called_once() # no error only if autospec=False
E AssertionError:未找到预期的调用。
E 预期:乘法(3)
E 实际:multiply(, 3)
我认为使用 autospec=True 进行嘲弄是一种推荐做法,但很明显,我对它的工作原理有错误的理解,尽管我读过 this post 和 this one 等。
有人可以澄清一下这个问题吗?
【问题讨论】:
标签: python mocking pytest monkeypatching pytest-mock