python - 模拟 celery 任务的单元测试 Flask View

标签 python unit-testing mocking flask celery

所以,我有一个 flask View ,它将 celery 任务添加到队列中,并向用户返回 200。

from flask.views import MethodView
from app.tasks import launch_task

class ExampleView(MethodView):
    def post(self):
        # Does some verification of the incoming request, if all good:
        launch_task(task, arguments)
        return 'Accepted', 200

问题在于测试以下内容,我不想拥有 celery 实例等。我只想知道在所有验证都正常之后,它会向用户返回 200。 celery launch_task() 将在别处进行测试。

因此,我热衷于模拟 launch_task() 调用,这样它基本上什么都不做,使我的单元测试独立于 celery 实例。

我已经尝试过以下的各种形式:

@mock.patch('app.views.launch_task.delay'):
def test_launch_view(self, mock_launch_task):
    mock_launch_task.return_value = None
    # post a correct dictionary to the view
    correct_data = {'correct': 'params'}
    rs.self.app.post('/launch/', data=correct_data)
    self.assertEqual(rs.status_code, 200)

@mock.patch('app.views.launch_task'):
def test_launch_view(self, mock_launch_task):
    mock_launch_task.return_value = None
    # post a correct dictionary to the view
    correct_data = {'correct': 'params'}
    rs.self.app.post('/launch/', data=correct_data)
    self.assertEqual(rs.status_code, 200)

但似乎无法让它工作,我的 View 只是以 500 错误退出。如有任何帮助,我们将不胜感激!

最佳答案

我也尝试了任何 @patch 装饰器,但它没有用 我在 setUp 中找到了 mock,比如:

import unittest
from mock import patch
from mock import MagicMock

class TestLaunchTask(unittest.TestCase):
    def setUp(self):
        self.patcher_1 = patch('app.views.launch_task')
        mock_1 = self.patcher_1.start()

        launch_task = MagicMock()
        launch_task.as_string = MagicMock(return_value = 'test')
        mock_1.return_value = launch_task

    def tearDown(self):
        self.patcher_1.stop()

关于python - 模拟 celery 任务的单元测试 Flask View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17132431/

相关文章:

python - 如何修复 ImportError : No module named packages. urllib3?

python - Numpy 数组 : Function affects original input object as well

python - 比较列表中的字典python

android - 如何使用 MockK 测试挂起功能?

unit-testing - 使用 CPPUnit 从异常中恢复

java - 当存在来自父类(super class)的依赖注入(inject)时,如何设置测试?

Python 内部类 self

angular - 单元测试 Angular Material 对话框 - 如何包含 MAT_DIALOG_DATA

c# - 单元测试中的模拟在 LINQ.Where 返回 null

spring - WebTestClient 未注入(inject)