Python 是否可以限制模拟函数调用的计数?
我在编写单元测试时遇到了一个问题。这是单元测试文件中的一个chunck:Python 是否可以限制模拟函数调用的计数?,python,django,unit-testing,django-models,mocking,Python,Django,Unit Testing,Django Models,Mocking,我在编写单元测试时遇到了一个问题。这是单元测试文件中的一个chunck: main.obj = MainObj.objects.create(short_url="a1b2c3") with unittest.mock.patch('prj.apps.app.models.base.generate_url_string', return_value="a1b2c3") as mocked_generate_url_string: obj.generate_short_url() 这
main.obj = MainObj.objects.create(short_url="a1b2c3")
with unittest.mock.patch('prj.apps.app.models.base.generate_url_string', return_value="a1b2c3") as mocked_generate_url_string:
obj.generate_short_url()
这是文件“prj.apps.app.models.base”(导入正在模拟的函数“generate\u url\u string”的文件)中的一段代码:
我想在单元测试中显示,如果系统中的某些对象具有类似的短url,则函数“generate_short_url”不会返回重复值。为此,我使用预定义的返回结果模拟了“generate_url_string”。
问题是我不能用这个值限制模拟函数的调用次数,结果代码进入无限循环。
我只想用预定义的结果(“a1b2c3”)调用我的函数一次。在那之后,我希望函数像往常一样工作。大概是这样的:
with unittest.mock.patch('prj.apps.app.models.base.generate_url_string', return_value="a1b2c3", times_to_call=1) as mocked_generate_url_string:
obj.generate_short_url()
但我在模拟库中没有看到任何类似“times\u to\u call”的属性。
有什么方法可以处理这个问题吗?定义一个生成器,首先生成固定值,然后生成实函数的返回值(作为参数传递以避免调用修补值) 然后,将生成器用作修补功能的副作用
with unittest.mock.patch(
'prj.apps.app.models.base.generate_url_string',
side_effect=mocked(prj.apps.app.models.base.generate_url_string)) as mocked_generate_url_string:
obj.generate_short_url()
定义一个生成器,首先生成固定值,然后生成实函数的返回值(作为参数传递以避免调用修补值) 然后,将生成器用作修补功能的副作用
with unittest.mock.patch(
'prj.apps.app.models.base.generate_url_string',
side_effect=mocked(prj.apps.app.models.base.generate_url_string)) as mocked_generate_url_string:
obj.generate_short_url()
非常感谢,它很有效!我唯一改变的是首先从project导入一个被模拟的函数,然后对其进行修补:从prj.apps.app.models.base import generate_url_string;使用unittest.mock.patch('prj.apps.app.models.base.generate_url_string',side_effect=mock(generate_url_string))作为mock_generate_url_string:obj.generate_short_url()非常感谢,它可以工作!我唯一改变的是首先从project导入一个被模拟的函数,然后对其进行修补:从prj.apps.app.models.base import generate_url_string;使用unittest.mock.patch('prj.apps.app.models.base.generate_url_string',side_effect=mock(generate_url_string))作为mock_generate_url_string:obj.generate_short_url()
with unittest.mock.patch(
'prj.apps.app.models.base.generate_url_string',
side_effect=mocked(prj.apps.app.models.base.generate_url_string)) as mocked_generate_url_string:
obj.generate_short_url()