【问题标题】:Odoo: test unique constraint?Odoo:测试唯一约束?
【发布时间】:2016-05-28 14:09:04
【问题描述】:

Odoo 似乎无法测试唯一约束。

我已经添加了这个约束:

_sql_constraints = [(
    'uniq_line',
    'unique(routing_phase_id, project_id)',
    'Phase have to be unique per Routing!')
]

约束本身有效,但运行unittest,我无法成功测试。

我试过了:

from psycopg2 import IntegrityError

with self.assertRaises(IntegrityError):
     self.env['project.routing.line'].create(
        self.project_routing_line_1.copy_data()[0])

运行测试时出现此错误:

2016-05-28 13:59:16,575 19786 ERROR pas_test openerp.sql_db: bad query: INSERT INTO "project_routing_line" ("id", "routing_phase_id", "sequence", "next_routing_phase_id", "duration", "project_id", "return_routing_phase_id", "need_approve", "create_uid", "write_uid", "create_date", "write_date") VALUES(nextval('project_routing_line_id_seq'), 1, 5, NULL, 10.0, 5, 3, false, 1, 1, (now() at time zone 'UTC'), (now() at time zone 'UTC')) RETURNING id
Traceback (most recent call last):
  File "/home/oerp/openerp80/odoo/openerp/sql_db.py", line 234, in execute
    res = self._obj.execute(query, params)
IntegrityError: duplicate key value violates unique constraint "project_routing_line_uniq_line"
DETAIL:  Key (routing_phase_id, project_id)=(1, 5) already exists

所以我不明白,测试捕获了 IntegrityEror(或者它没有?),但是 Odoo 仍然尝试创建当然失败的记录。我在这里做错了吗?

更新

我开始想,也许是因为它是 SQL 约束,python 没有在正确的时间捕捉到这样的异常(比如使用assertRaises),因为它发生在所有 python 验证之后?这可以解释为什么测试失败了。

【问题讨论】:

  • 其实我看不出这里有什么问题。尝试创建记录时出现 IntegrityError。我错过了什么吗?
  • @CZoellner 你没看到我在用assertRaises吗?它的目的是测试异常并测试它你需要在你期望得到一个异常时捕获它。但在我的情况下,IntegrityError 没有被捕获(例如,assertRaises 可以很好地捕获其他异常。我实际上尝试创建非唯一记录,而不是像我意外地那样做。
  • 啊,是的,我没看到。

标签: python unit-testing openerp odoo-8 unique-constraint


【解决方案1】:

自己遇到了这个问题,发现了一个 Odoo 自己使用的现有测试。

他们在测试引发 IntegrityError 的方法上使用 openerp.tools.mute_logger('openerp.sql_db') 装饰器。

https://github.com/odoo/odoo/blob/7682760dcad232829fbb5d4221f66a1ebb9d6c91/openerp/addons/base/tests/test_views.py#L864

我将装饰器添加到我的测试方法中并且它工作正常。我想记录的 IntegrityError 会抑制异常的引发。

【讨论】:

    猜你喜欢
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多