如何在huey任务中进行模拟/猴子修补?

时间:2016-01-24 09:12:11

标签: python python-mock python-huey

我想测试huey任务,需要修补requests.get

# huey_tasks.py

from huey import RedisHuey

huey = RedisHuey()

@huey.task()
def function():
    import requests
    print(requests.get('http://www.google.com'))

运行测试的文件:

import huey_tasks

@patch('requests.get')
def call_patched(fake_get):
    fake_get.return_value = '1'
    huey_tasks.function()

启动huey_consumer:huey_tasks.huey -w 10 -l logs/huey.log
运行测试,但修补没有任何影响。

[2016-01-24 17:01:12,053] INFO:requests.packages.urllib3.connectionpool:Worker-1:Starting new HTTP connection (1): www.google.com
[2016-01-24 17:01:12,562] INFO:requests.packages.urllib3.connectionpool:Worker-1:Starting new HTTP connection (1): www.google.com.sg
<Response[200]>

如果我删除@huey.task()装饰器,则修补工作并打印1

那么我应该如何测试huey任务?毕竟,我不能每次都删除装饰器,必须是一个更好的方法。

2 个答案:

答案 0 :(得分:2)

好的,终于找到了一种测试方法

# huey_tasks.py

def _function():
    import requests
    print(requests.get('http://www.google.com'))

function = huey.task()(_function)
import huey_tasks

重要的是首先定义实际的任务函数然后装饰它。请注意,huey.task是一个需要参数的装饰器。

@patch('requests.get')
def test_patched(fake_get):
    fake_get.return_value = '1'
    huey_tasks._function()

直接运行测试代码而不启动huey_consumer

答案 1 :(得分:0)

如果我读得正确,那就是你的问题

  • Huey任务在单独的消费者流程中运行

  • 单元测试在他们自己的过程中运行

进程无法模拟或修补另一个。任

  • 制作代码路径,这样您就不需要模拟补丁使用者流程...不要直接调用任务,而是让它们成为可以公开和修补的功能

  • 使用线程

  • 在测试过程中运行huey