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

时间:2021-03-25 19:12:08

标签: python django pytest

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

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

    Profile.objects.create_profile(instance)
    return None

在 Profile 对象管理器中,我遍历权限并将它们分配给 Profile 对象:

    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:权限 匹配查询不存在

据我所知,PyTest 试图创建用户夹具。用户模型发出在 Profile 中处理的 post_save 信号。但是,我迭代所需的权限尚未在数据库中。

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

@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

但是,那么我需要在每次测试中定义用户和相关对象(user_profile、user_profile_settings):

@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 中每个装置的信号? 或者,我可以让信号起作用,以便在创建用户装置后,我可以在一个装置中返回所有相关对象(配置文件、设置)?

谢谢。

0 个答案:

没有答案