Django通道使用HttpCommunicator进行测试



我有一个DRF应用程序,它也有一个websocket使用者

现在我正在尝试制作一个测试用例,它继承了Djano 3.1的测试用例。所述测试用例应通过rest_auth注册端点注册用户,然后连接到通道消费者

为了在测试用例中注册用户,我使用HttpCommunicator,如下所示:

class TestRoomWebsockets(APITestCase):
async def test_connect(self):
communicator = HttpCommunicator(
application, "POST", reverse(UrlUtils.Users.REGISTER), 
body=json.dumps({"username": ..., "password1": ..., "password2": ...}).encode("utf-8")
)
response = await communicator.get_response()
self.assertEqual(response["status"], 200)

但它失败了,状态代码为400。响应为

{'status': 400, 'headers': [(b'Content-Type', b'application/json'), (b'Vary', b'Accept'), (b'Allow', b'POST, OPTIONS'), (b'X-Frame-Options', b'DENY'), (b'Content-Length', b'120'), (b'X-Content-Type-Options', b'nosniff'), (b'Referrer-Policy', b'same-origin')], 'body': b'{"username":["This field is required."],"password1":["This field is required."],"password2":["This field is required."]}'}

我不知道为什么数据会在某个地方丢失。有人能解释一下吗,我做错了什么?如果需要更多细节来解决问题,请告知。

一些附加文件

asgi应用程序如下所示:

application = ProtocolTypeRouter({
"http": django_asgi_app,
"websocket": TokenAuthMiddlewareStack(
URLRouter([
path('ws/', my_router),
])
)
})

如果您需要在测试中使用带有通道的数据库事务,则必须使用SimpleTestCase。APITestCase或TestCase不允许事务,您必须使用django测试中的SimpleTestCase,并将数据库设置为所有数据库。只要有这样的区别,我想它就会起作用。请注意,事务将在测试之间保存,而不会在测试后回滚。

from django.test import SimpleTestCase
class TestRoomWebsockets(APITestCase):
databases = '__all__'
async def test_connect(self):
communicator = HttpCommunicator(
application, "POST", reverse(UrlUtils.Users.REGISTER), 
body=json.dumps({"username": ..., "password1": ..., "password2": ...}).encode("utf-8")
)
response = await communicator.get_response()
self.assertEqual(response["status"], 200)

以下是SimpleTestCase的信息https://docs.djangoproject.com/en/4.0/topics/testing/tools/

最新更新