在Django Channels Pytest测试期间测试数据库未保留数据

时间:2019-05-16 19:24:41

标签: python django python-3.x pytest django-channels

我在documentation之后为Django Channels应用程序编写测试。我可以成功测试与WebSocket使用者的连接和通讯。但是,在其中一项测试中,我需要创建一个用户。

这是我的测试方法:

storeId

在处理Ext.getStore('storeIdentifier');情况的方法内部发生错误。当尝试保存另一个具有User作为外键的模型实例时,测试失败。

@pytest.mark.django_db
@pytest.mark.asyncio
async def test_1():
    my_user = get_user_model().objects.create_user(username='my_user', email='user@user.com', password='123456')
    my_user.save()

    print(User.objects.all())

    communicator = WebsocketCommunicator(MyConsumer, '/websocket/')
    communicator.instance.scope['user'] = my_user
    connected, subprotocol = await communicator.connect()
    assert connected
    await communicator.send_json_to({
        'command': 'test',
    })
    response = await communicator.receive_json_from(timeout=5)
    await communicator.disconnect()

如果我在使用者内部的方法中(在前两行之间)添加'command' == 'test',它将返回一个空的QuerySet,而测试方法本身的第一个client = Client(user=scope['user']) client.save() 将返回创建的用户。当然,由于没有用户,因此测试失败并显示:

print(User.objects.all())

我尝试将用户创建转变为另一种异步方法并为此print进行修改,但没有任何变化。为什么在执行测试期间将django.db.utils.IntegrityError: insert or update on table "chat_client" violates foreign key constraint "chat_client_user_id_d10928fc_fk_auth_user_id" DETAIL: Key (user_id)=(1) is not present in table "auth_user". 表清空?如何保留测试开始时创建的数据?

1 个答案:

答案 0 :(得分:0)

正如@hoefling在评论中指出的那样,唯一缺少的是使测试具有事务性,如this question所示。

就我而言,我只需要将测试装饰器更改为:

array.reshape(1, -1)