gpt4 book ai didi

python - 如何修补 python 方法以运行测试用例?

转载 作者:行者123 更新时间:2023-12-01 09:21:32 25 4
gpt4 key购买 nike

我正在做的一个项目基本上所有事情都使用 django。在编写模型时,我发现有必要重写 save() 方法以分拆由工作人员运行的任务:

class MyModel(models.Model)
def _start_processing(self):
my_task.apply_async(args=['arg1', ..., 'argn'])
def save(self, *args, **kwargs):
"""Saves the model object to the database"""
# do some stuff
self._start_processing()
# do some more stuff
super(MyModel, self).save(*args, **kwargs)

在我的测试器中,我想测试由 # do some stuff# do some more stuff 指定的保存覆盖部分,但不要想要运行任务。为此,我相信我应该使用模拟(我对此很陌生)。

在我的测试类中,我将其设置为跳过任务调用:

class MyModelTests(TestCase):
def setUp(self):
# Mock the _start_processing() method. Ha!
@patch('my_app.models.MyModel._start_processing')
def start_processing(self, mock_start_processing):
print('This is when the task would normally be run, but this is a test!')

# Create a model to test with
self.test_object = MyModelFactory()

由于工厂创建并保存模型的实例,因此我需要在调用之前覆盖 _start_processing() 方法。上面的内容似乎不起作用(并且任务运行并失败)。我错过了什么?

最佳答案

首先,您必须将装饰器包装到装饰器中,而不是要用作替换的函数,而是您的模拟应该工作的“范围”。因此,例如,如果您需要模拟整个 MyModelTests 类的 _start_processing,则应将装饰器放置在类定义之前。如果仅适用于一种测试方法 - 仅用它包装测试方法。

其次,在类外部的某个位置定义 start_processing 函数,并传递 @patch('my_app.models.MyModel._start_processing', new=start_processing),这样就可以了将知道使用什么来替代实际方法。但请注意要匹配实际的方法签名,因此只需使用

def start_processing(self):
print('This is when the task would normally be run, but this is a test!')

第三,您必须向此类内的每个测试用例(test_...方法)添加 mock_start_processing 参数,因为模拟的工作原理如下:)。

最后。您必须了解要修补的目标。您当前的 my_app.models.MyModel._start_processing 可能已损坏。您必须使用类的使用路径(而不是定义路径)来修补该类。因此,如果您在 TestCase 中使用 MyModelFactory 创建对象,并且 MyModelFactory 位于 my_app.factories 中并且它会导入MyModel 作为 from .models import MyModel,您必须使用 @patch('my_app.factories.MyModel._start_processing'),而不是 'my_app.models.MyModel._start_processing'

希望它能有所帮助。

关于python - 如何修补 python 方法以运行测试用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50767028/

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