Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以限制模拟函数调用的计数?_Python_Django_Unit Testing_Django Models_Mocking - Fatal编程技术网

Python 是否可以限制模拟函数调用的计数?

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() 这

我在编写单元测试时遇到了一个问题。这是单元测试文件中的一个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()
这是文件“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()