在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的信号? 或者,我可以让信号工作,这样在创建用户装置后,我可以在一个装置中返回所有相关对象(配置文件、设置)
谢谢
目前没有回答
相关问题 更多 >
编程相关推荐