Es sieht so aus, als ob Odoo beim Testen der einzigartigen Einschränkung versagt.Odoo: unique constraint testen?
Ich habe diese Einschränkung hinzugefügt:
_sql_constraints = [(
'uniq_line',
'unique(routing_phase_id, project_id)',
'Phase have to be unique per Routing!')
]
Constraint selbst funktioniert, aber Unittest ausgeführt wird, kann ich nicht erfolgreich testen.
ich das versucht:
from psycopg2 import IntegrityError
with self.assertRaises(IntegrityError):
self.env['project.routing.line'].create(
self.project_routing_line_1.copy_data()[0])
ich diesen Fehler, wenn Test ausgeführt wird:
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
es so bekomme ich nicht, Test fängt IntegrityEror (? Oder eben nicht), aber Odoo versucht immer noch, Aufzeichnungen zu erstellen, was natürlich fehlschlägt. Mache ich hier etwas falsch?
aktualisiert
Ich begann zu denken, vielleicht, weil es SQL-Einschränkung ist, Python solche Ausnahmen zur richtigen Zeit nicht (wie mit assertRaises
) fängt, weil es nach all Python Validierungen passiert? Das würde erklären, warum der Test fehlschlägt.
Eigentlich sehe ich das Problem hier nicht. Sie haben einen IntegrityError beim Versuch, Ihren Datensatz zu erstellen. Habe ich etwas verpasst? – CZoellner
@CZoellner Siehst du nicht, dass ich 'assertRaises' verwende? Sein Zweck besteht darin, Ausnahmen zu testen und zu testen, die Sie abfangen müssen, wenn Sie eine Ausnahme erwarten. Aber in meinem Fall wird 'IntegrityError' nicht eingefangen (zum Beispiel werden andere Ausnahmen mit' assertRaises' abgefangen. Ich versuche tatsächlich nicht-eindeutige Datensätze zu erstellen, nicht so, als würde ich das unerwartet machen.) – Andrius
Ah, ja, ich tat es nicht siehst du das. – CZoellner