【问题标题】:How to trigger allauth.account.signals.user_signed_up signal using pytest?如何使用 pytest 触发 allauth.account.signals.user_signed_up 信号?
【发布时间】:2021-05-14 22:11:30
【问题描述】:

我的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:用户没有用户信任。

我错过了什么?

【问题讨论】:

    标签: django django-allauth pytest-django


    【解决方案1】:

    您通过 django_user_model 创建用户的问题在于它实际上并没有通过实际发送该信号的 allauth 代码。你有两个选择:

    1. 使用client(因为我假设您使用的是pytest-django)并通过allauth提供的链接填写注册以注册新用户。这样,就会发送一个信号,您可以像这样断言属性和模型实例。
    2. 您可以简单地忽略信号并对函数本身进行单元测试。就是这样。您相信这个单一的注册视图根本不会改变,并相信 API 不会改变的包。我仍然可以推荐此选项,但您已收到警告。
    3. 您可以自己发送信号。如果 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 非常有名,而且你知道在没有太大的包变化的情况下会发生什么,但你永远不知道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2022-01-21
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      相关资源
      最近更新 更多