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