【问题标题】:How can I test overriden function in Django admin?如何在 Django admin 中测试覆盖功能?
【发布时间】:2020-05-26 21:47:49
【问题描述】:

我在admin 模块中覆盖了函数

@admin.register(Donation)
class DonationAdmin(admin.ModelAdmin):
    def log_change(self, request, object, message):
        log_obj = super().log_change(request, object, message)

        name_map = {name: value.label for name, value
                    in DonationForm.base_fields.items()}

        extended_log = ''
        if message:
            changed_fields = message[0].get('changed').get('fields')
            extended_log = {key: value for key, value in request.POST.items()
                            if key in changed_fields}
            extended_log = self.get_humanize_values(extended_log)

            extended_log = dict(
                zip(
                    map(lambda x: name_map[x], extended_log.keys()),
                    extended_log.values()
                )
            )

        return AdditionalLogEntry.objects.create(
            entry=log_obj, extended_log=extended_log)

我该如何测试它?

class DonationAdminTestCase(TestCase):
    def setUp(self) -> None:
        self.user = UserFactory()
        self.donation = DonationFactory()
        self.donation_admin = DonationAdmin(model=Donation, admin_site=AdminSite())

    def test_log_change(self) -> None:
        self.user.is_staff = True
        self.user.save()
        self.client.force_login(self.user)
        # ???

【问题讨论】:

  • 我会发布到更改视图本身以对对象进行更改,然后测试是否有额外的日志条目。

标签: python django django-admin python-unittest django-unittest


【解决方案1】:

我会在更改视图本身上发布一个帖子,这应该会触发更改的日志记录。

change_url = reverse('admin:myapp_donation_change', args=(self.donation.id,))
data = {...}  # dictionary with all the data required to make a successful change
self.client.post(change_url, data=data)
self.assertEqual(1, AdditionalLogEntry.objects.count())
...

【讨论】:

  • 谢谢。我明白你的意思。一个有趣的解决方案。告诉我,data dict 应该是什么样子才能发起 log_change 呼叫?例如。表Donation 有一列Note (CharField),我想更改它。
  • 它需要包含可以在Donation 对象上更改的所有字段并且是必需的,但基本上您希望它包含表单的所有字段。最简单的方法是在浏览器中进行实际更改,然后在浏览器开发工具(网络选项卡)中查看 POST 数据。 {'note': 'some_string'} 将是其中的一部分,但如果需要其他字段,则表单将不会验证,因此不会进行任何更改(也不会进行 log_change())。
猜你喜欢
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 2014-08-15
  • 2011-08-02
  • 2017-10-09
  • 2017-05-26
  • 2017-08-23
  • 2012-04-19
相关资源
最近更新 更多