如何使用 pytest 触发 allauth.account.signals.user_signed_up 信号?
How to trigger allauth.account.signals.user_signed_up signal using pytest?
我的 UserTrust
模型和 django.contrib.auth.models.User
之间有一个 OneToOneField
,我想在新的 User
注册时创建它。我考虑过使用 user_signed_up
信号创建 UserTrust
实例。
我的 AppConfig
中有以下代码
def ready(self):
# importing model classes
from .models import UserTrust
@receiver(user_signed_up)
def create_usertrust(sender, **kwargs):
u = kwargs['user']
UserTrust.objects.create(user=u)
...这是在我的 pytest 测试中
@pytest.fixture
def test_password():
return 'strong-test-pass'
@pytest.fixture
def create_user(db, django_user_model, test_password):
def make_user(**kwargs):
kwargs['password'] = test_password
if 'username' not in kwargs:
kwargs['username'] = str(uuid.uuid4())
return django_user_model.objects.create_user(**kwargs)
return make_user
@pytest.mark.django_db
def test_my_user(create_user):
user = create_user()
assert user.usertrust.available == 1000
仍然,测试失败
django.contrib.auth.models.User.usertrust.RelatedObjectDoesNotExist: User has no usertrust.
我错过了什么?
您通过 django_user_model 创建用户的问题是它实际上并没有通过实际发送该信号的 allauth 代码。您有两个选择:
- 使用
client
(因为我假设您使用的是 pytest-django)并通过提供的 allauth 填写注册 link 以注册新用户。这样,一个信号被发送,你可以像那样断言属性和模型实例。
- 您可以简单地忽略信号并对函数本身进行单元测试。而已。您相信那个单一的注册视图根本不会改变,并且相信 API 不会改变的包。我仍然可以推荐此选项,但您已被警告。
- 您可以自己发送信号。不推荐以防 allauth 的 API 发生变化,但您可以从 allauth 导入信号并像这样发送它:
user_signed_up.send(sender=self.__class__, toppings=toppings, size=size)
其中 user_signed_up
是信号。参考文档:https://docs.djangoproject.com/en/dev/topics/signals/#sending-signals
同样,绝对推荐第一个,以防 API 发生变化。我也可以推荐第二个选项,因为 allauth 非常有名,你知道在没有太大的包更改的情况下会发生什么,但你永远不知道。
我的 UserTrust
模型和 django.contrib.auth.models.User
之间有一个 OneToOneField
,我想在新的 User
注册时创建它。我考虑过使用 user_signed_up
信号创建 UserTrust
实例。
我的 AppConfig
def ready(self):
# importing model classes
from .models import UserTrust
@receiver(user_signed_up)
def create_usertrust(sender, **kwargs):
u = kwargs['user']
UserTrust.objects.create(user=u)
...这是在我的 pytest 测试中
@pytest.fixture
def test_password():
return 'strong-test-pass'
@pytest.fixture
def create_user(db, django_user_model, test_password):
def make_user(**kwargs):
kwargs['password'] = test_password
if 'username' not in kwargs:
kwargs['username'] = str(uuid.uuid4())
return django_user_model.objects.create_user(**kwargs)
return make_user
@pytest.mark.django_db
def test_my_user(create_user):
user = create_user()
assert user.usertrust.available == 1000
仍然,测试失败
django.contrib.auth.models.User.usertrust.RelatedObjectDoesNotExist: User has no usertrust.
我错过了什么?
您通过 django_user_model 创建用户的问题是它实际上并没有通过实际发送该信号的 allauth 代码。您有两个选择:
- 使用
client
(因为我假设您使用的是 pytest-django)并通过提供的 allauth 填写注册 link 以注册新用户。这样,一个信号被发送,你可以像那样断言属性和模型实例。 - 您可以简单地忽略信号并对函数本身进行单元测试。而已。您相信那个单一的注册视图根本不会改变,并且相信 API 不会改变的包。我仍然可以推荐此选项,但您已被警告。
- 您可以自己发送信号。不推荐以防 allauth 的 API 发生变化,但您可以从 allauth 导入信号并像这样发送它:
user_signed_up.send(sender=self.__class__, toppings=toppings, size=size)
其中user_signed_up
是信号。参考文档:https://docs.djangoproject.com/en/dev/topics/signals/#sending-signals
同样,绝对推荐第一个,以防 API 发生变化。我也可以推荐第二个选项,因为 allauth 非常有名,你知道在没有太大的包更改的情况下会发生什么,但你永远不知道。