端到端测试Django Channels后台任务

时间:2017-06-22 23:22:51

标签: django testing django-channels

我正在尝试对使用Channels和Websockets的Django应用程序进行端到端测试。 在我的情况下,请求触发复杂的背景计算,我想观察它的影响。 据我所知,在Django测试套件中,没有办法运行worker,这将消耗Django Channels的后台任务。

是否有任何方法可以使用正确的参数触发后台任务?我是否必须修改我的代码以使其可测试?

以下是我的设置的简化骨架:

views.py

{ "id" : 2 }

routing.py

def calculation(request):
    # doing some simple calculation depending on request
    simple_result, parameter = simple_calculation(request)
    # trigger complex asynchronous calculation depending on parameter
    Channel('background-calculations').send({
        "parameter": parameter,
    })
    # return results of simple calculation
    return render(request, 'simple_reponse.html',{'simple_result': simple_result})

consumers.py

channel_routing = [
    route("background-calculations", run_background_calculations),
    route("websocket.connect", ws_connect),
    route("websocket.receive", ws_message),
]

当我尝试使用客户端(例如REST APIClient)访问视图时,我确实收到了响应,但后台任务从未执行过。有没有办法测试整个链?

1 个答案:

答案 0 :(得分:2)

所以我最终弄明白了。

如果有人发现这个问题,以下是如何执行端到端测试:

from channels.test import Client
from rest_framework.test import APIClient

# setup
rest = APIClient()
channelclient = Client()
Group("frontend-updates").add(u"test-channel") 
rest.login(username="username",password="password")

class CopyTestCase(ChannelTestCase):
    def test_end_to_end(self):
        # trigger HTTP POST request
        response = rest.post("/calculate/")
        #...check response...

        # consume the background-calculation task (has to be done manually)
        channelclient.consume(u"background-calculations")

        # check data sent to the front-end as a result of this calculation
        message = testcase.get_next_message(u"test-channel")
        #...check message...