我想写一个测试“A”函数调用另一个“B”函数。B函数看起来像这样:
def Bfuncion(self, city: Optional[str], name: Optional[str]):
在A函数中,我使用了B函数两次,第一次是这样使用:
cities = self.Bfunction(name=None, city="ny", page=page)
第二次是这样的
cities = self.Bfunction(name="Tom", city=None, page=page)
现在我想写一个测试的A函数,我会尝试如果只有一个使用B函数:
mocker.patch(
"Path.To.My.Function",
return_value=[
{"someReturnValue"},
{"someReturnValue"},
{"someReturnValue"},
],
如何编写call mocker()
,因为我在每次调用中使用了带有不同参数的B函数。
2条答案
按热度按时间nx7onnlm1#
使用
side_effect
关键字参数,而不是return_value
关键字参数。(当然,
patch
只是简单地将它自己无法识别的关键字参数传递给Mock
,以配置修补名称所使用的对象。)这就要求你提前知道调用的顺序,如果你需要更大的灵活性,用一个你想要的自定义函数来代替
Mock
对象。yiytaume2#
我试着给你一个解答我不知道这是否适合你的需要,因为我曾尝试猜测你在问题中遗漏的一些细节。
生产代码
我假设您的产品代码包含在一个名为
functions.py
的文件中,functions.py
的内容如下:请注意,在
functions.py
中:1.我定义了一个类,因为我看到您的
Bfunction
定义包含self
参数。Afunction
执行您在问题中编写的两个Bfunction
调用。测试文件
测试文件(不使用
pytest
,仅使用模块unittest
)如下所示:测试文件执行的输出
测试文件执行的输出为:
输出显示:
Afunction
调用的次数正好是Bfunction
的两倍1.测试验证通过使用属性
call_args_list
传递给Bfunction
的参数1.输出中
cityA
和cityB
的出现向您展示了如何选择Bfunction
返回的不同值(您必须使用side_effect
而不是return_value
)。我希望这个答案对你有用。