2016-05-28 18 views
1

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.

+0

Eigentlich sehe ich das Problem hier nicht. Sie haben einen IntegrityError beim Versuch, Ihren Datensatz zu erstellen. Habe ich etwas verpasst? – CZoellner

+0

@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

+0

Ah, ja, ich tat es nicht siehst du das. – CZoellner

Antwort

1

Dieses Problem ist mir selbst aufgefallen und hat einen bestehenden Test gefunden, den Odoo selbst verwendet hat.

Sie verwenden einen openerp.tools.mute_logger('openerp.sql_db') Decorator auf Methoden testen, dass ein IntegrityError ausgelöst wird.

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

Ich fügte den Dekorateur meiner Testmethode und es funktionierte. Ich nehme an, der IntegrityError, der protokolliert wird, unterdrückt das Aufheben der Ausnahme.

Verwandte Themen