在创建PyTest夹具期间,如何使Django信号静音?

2024-05-19 22:10:41 发布

您现在位置:Python中文网/ 问答频道 /正文

在Django项目中,我通过post_保存信号创建用户的配置文件:

@receiver(post_save, sender=User)
def post_save_user(sender, instance, *args, **kwwargs):

    Profile.objects.create_profile(instance)
    return None

在配置文件对象管理器中,我迭代权限并将其分配给配置文件对象:

    for perm in ASSIGNED_PERMISSIONS['profile']:
        assign_perm(perm[0], user, profile)

当我尝试在PyTest中创建用户装置时:

@pytest.fixture
def user(db, django_user_model):
    return django_user_model.objects.create(username='user', password='password')

我发现数据库中缺少权限时出错

django.contrib.auth.models.Permission.DoesNotExist: Permission matching query does not exist

据我所知,PyTest试图创建用户装置。用户模型发出post_保存信号,该信号在配置文件中处理。但是,我迭代的所需权限尚未在数据库中

解决方案之一是使用自动使用的夹具禁用信号,然后将其应用于每个测试:

@pytest.fixture(autouse=True)
def mute_signals(request):

    restore = {}
    if not 'enable_signals' in request.keywords:
        signals = [
            pre_save,
            post_save,
            pre_delete,
            post_delete,
            m2m_changed
        ]

        for signal in signals:
            restore[signal] = signal.receivers
            signal.receivers = []

    yield

    for signal, receivers in restore.items():
        signal.receivers = receivers

但是,我需要在每个测试中定义用户和相关对象(用户配置文件、用户配置文件设置):

@pytest.mark.django_db
def test_check_follows():
    user = User.objects.create(username='user', password='password')
    user1 = User.objects.create(username='user1', password='password1')
    profile = ..
    profile1 = ...
    get_or_create_fellowship(user, user1)

为了简单起见,我更愿意将所有装置都保存在conftest.py中

问题是如何在conftest.py中禁用每个fixture的信号? 或者,我可以让信号工作,这样在创建用户装置后,我可以在一个装置中返回所有相关对象(配置文件、设置)

谢谢


Tags: 对象用户signalobjects信号savedef配置文件