看起来 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 验证之后?这可以解释为什么测试失败。
最佳答案
我自己也遇到过这个问题,并找到了 Odoo 自己使用的现有测试。
他们在测试引发 IntegrityError 的方法上使用 openerp.tools.mute_logger('openerp.sql_db')
装饰器。
我将装饰器添加到我的测试方法中并且它起作用了。我猜想记录的 IntegrityError 会抑制异常的引发。
关于python - Odoo:测试唯一约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37499977/