ja hallo erstmal,…
leider gelingt es mir noch nicht so ganz, das verhalten von AR in während
unit-tests nachzuvollziehen.
Derzeit habe ich das Problem, dass destroy auf ein Objekt angewandt,
dieses
einfriert aber nicht aus der Datenbank löscht.
Also:
Ich habe einen kleinen Test:
http://pastie.caboo.se/133335
Der Hintergrund ist schnell erklärt:
Zwei Modelle (contacts und contact_combies) stehen in in einer
habtm-Relation.
Über einen setter im contact sollen attribute für das contact_combi gesetzt
werden können (vgl. complex forms railscasts)
Das contact-Modell sieht dann so aus:
http://pastie.caboo.se/133336
Das ContactCombi-Modell so:
http://pastie.caboo.se/133337
Dabei habe ich beobachtet:
- In der Anwendung funktioniert der Code einwandfrei
- Der Test bricht mit der assertion in Zeile 20 ab, da zwei statt (wie
erwartet ein) Objekt existieren - Es wird auf jeden Fall versucht das Objekt zu löschen, da das
before_destroy
Callback der ContactCombi aufgerufen wird, d.h. die Meldung (vgl. Zeile
8 -
ContactCombi Modell) erscheint. - Es wird keine delete-Anweisung auf der Datenbank Ausgeführt (vgl. Log)
- Richtig absurd wird’s jedoch wenn die Safe-Anweisung wiederholt wird,
d.h.
Zeile 19 (unit-Test) ausgeführt wird. In diesem Fall erscheint die
Fehlermeldung:
test_save_delete_multiple_contact_combies(ContactTest):
TypeError: can’t modify frozen hash
/var/lib/gems/1.8/gems/activerecord-1.15.6/lib/active_record/base.rb:1978:in
[]=' /var/lib/gems/1.8/gems/activerecord-1.15.6/lib/active_record/base.rb:1978:in
write_attribute’
/var/lib/gems/1.8/gems/activerecord-1.15.6/lib/active_record/attribute_methods.rb:67:in
attribute=' /var/lib/gems/1.8/gems/activerecord-1.15.6/lib/active_record/base.rb:1858:in
send’
/var/lib/gems/1.8/gems/activerecord-1.15.6/lib/active_record/base.rb:1858:in
method_missing' /home/jan/aptana-workspace-svn/contacts/app/helpers/save_mixin_helper.rb:3:in
before_create’
…
D.h. destroy wird korrekt auf dem ContactCombi Objekt aufgerufen und der
Hash
wird - wie dokumentiert - eingefrohren.
Warum erscheinen aber die Änderungen nicht in der Datenbank? Kann dies am
ActiveRecord-Cache liegen? - Wie erreiche ich, dass die delete Anweisung
auf
der Datenbank ausgeführt wird?
Danke,
Guten rutsch,
Jan