我正在尝试对使用Channels和Websockets的Django应用程序进行端到端测试。 在我的情况下,请求触发复杂的背景计算,我想观察它的影响。 据我所知,在Django测试套件中,没有办法运行worker,这将消耗Django Channels的后台任务。
是否有任何方法可以使用正确的参数触发后台任务?我是否必须修改我的代码以使其可测试?
以下是我的设置的简化骨架:
{ "id" : 2 }
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})
channel_routing = [
route("background-calculations", run_background_calculations),
route("websocket.connect", ws_connect),
route("websocket.receive", ws_message),
]
当我尝试使用客户端(例如REST APIClient)访问视图时,我确实收到了响应,但后台任务从未执行过。有没有办法测试整个链?
答案 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...