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
相关产品推荐
相关产品推荐

