You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo单元测试:如何以受限用户权限执行并解决sudo报错?

Odoo单元测试切换受限用户权限的正确方法

错误原因

你触发的AssertionError是因为当前使用的Odoo版本中,sudo()方法仅接受布尔值参数(用于开启/关闭超级用户模式),不能直接传入用户对象。

正确解决方案

要在单元测试中以受限用户权限执行操作,有两种可靠的方式:

方式一:使用with_user()切换用户

with_user()方法专门用于将模型环境切换到指定用户,直接替换你原有的sudo()调用即可:

def test_action_edit_cfdi_customer_04_access_error(self):
    self.limited_user = self.env['res.users'].create({
        'name': 'Limited User',
        'login': 'limited_user',
        'email': 'limited_user@example.com',
        'groups_id': [(6, 0, [self.env.ref('base.group_user').id])]
    })
    # 替换sudo为with_user,切换到受限用户
    self.partner_model_limited = self.env['res.partner'].with_user(self.limited_user)

    sample_partner_2 = self.partner_model_limited.create({
        'name': 'Empresa Prueba',
        'vat': 'EKU900317310',
    })

    with self.assertRaises(AccessDenied) as e:
        sample_partner_2.action_edit_cfdi_customer()

方式二:创建新的用户上下文环境

直接创建以目标用户为上下文的新环境,后续所有操作都基于该环境执行:

def test_action_edit_cfdi_customer_04_access_error(self):
    self.limited_user = self.env['res.users'].create({
        'name': 'Limited User',
        'login': 'limited_user',
        'email': 'limited_user@example.com',
        'groups_id': [(6, 0, [self.env.ref('base.group_user').id])]
    })
    # 创建受限用户的专属环境
    limited_env = self.env(user=self.limited_user)
    self.partner_model_limited = limited_env['res.partner']

    sample_partner_2 = self.partner_model_limited.create({
        'name': 'Empresa Prueba',
        'vat': 'EKU900317310',
    })

    with self.assertRaises(AccessDenied) as e:
        sample_partner_2.action_edit_cfdi_customer()

注意事项

  • 确保你创建的受限用户所属的用户组(这里是base.group_user)确实没有执行action_edit_cfdi_customer的权限,否则无法触发AccessDenied异常。
  • 部分Odoo新版本中sudo()支持传入用户对象,但你的版本显然不支持,因此优先使用上述两种兼容方法。

内容的提问来源于stack exchange,提问作者Ernesto Ruiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:16:06