python - 测试测试函数装饰器

标签 python django

如何测试仅用于 django 的 TestCase 方法的装饰器?我有一个装饰器,它创建管理员用户并将用户登录到测试客户端:

def create_admin_user_and_login(func):                                                                                                                                                                       
    @wraps(func)
    def wrapper(self):
        faker = Faker()
        username = faker.pronounceable_unique_id(length=30)
        password = faker.password()
        user = User.objects.create_user(
            username=username,
            first_name=faker.word().title(),
            last_name=faker.word().title(),
            email=faker.email(),
            password=password)
        user.is_staff = True
        user.is_superuser = True
        user.save()
        self.client.login(username=username, password=password)
        return func(self)
    return wrapper

其中Faker()是一个假数据生成器,与主题无关。我这样使用这个装饰器:

class SomeUnitTest(TestCase):
    @create_admin_user_and_login
    def test_login_required(self):
        self.assertContains(self.client.get(reverse('some_url')), 'logged in')

如何测试这个装饰器?我查看了 cpython 源代码来寻找答案,但找不到我的用例。

最佳答案

由于没有建议的常规解决方案,我采用了一个简单的解决方案:

class HelpersTest(TestCase):

    @helpers.create_admin_user_and_login
    def test_create_admin_user_and_login(self):
        self.assertIn('_auth_user_id', self.client.session)
        user = User.objects.get(pk=self.client.session['_auth_user_id'])
        self.assertTrue(user.is_staff)
        self.assertTrue(user.is_superuser)

我认为我可能在 coverage.py 捕获该问题时遇到一些问题,但这不是主要因素。

更新:coverage.py 没有问题,解决方案完美运行。

关于python - 测试测试函数装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20724950/

相关文章:

python - 如何使自定义 YAML 标签与 pyyaml 中的序列别名一起使用

python - 是否可以让 discord.py 机器人在没有用户触发的情况下向用户发送私有(private)消息?

node.js - Django channel 与 Node socket.io

python - pyodbc rowcount 只返回 -1

python - 使用 zlib 压缩和解压缩 UTF-8 数据的正确方法是什么?

python - Django可疑操作

python - Django 图片上传和调整大小

css - Django 管理 css 问题

django - 登录在 django 中不起作用 用户无法登录

python - 如何让Python将列表中的链接视为单个项目