Verhalten von AR bei Unit-Tests

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

Hallo,

Jan L. schrieb:

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.

liegts evtl an transactional fixtures?

http://www.thirdbit.net/articles/2007/06/26/transactional-fixtures-in-rails-a-head-banger/

Mit freundlichen Gruessen,
Roland M.


Moriz Softwareentwicklung
Theresienstrasse 66
80333 Muenchen

Tel: 089 / 216 685 91
Fax: 089 / 216 685 92
Web: http://www.moriz.de/
Xing: https://www.xing.com/profile/Roland_MORIZ

Steuernummer: 145/217/70350
Finanzamt Muenchen III

ja hallo erstmal,…

Am Montag, 31. Dezember 2007 schrieb Jan L.:

Derzeit habe ich das Problem, dass destroy auf ein Objekt angewandt,
dieses einfriert aber nicht aus der Datenbank löscht.

liegts evtl an transactional fixtures?

http://www.thirdbit.net/articles/2007/06/26/transactional-fixtures-in-rai
ls -a-head-banger/

Danke für den Tipp, aber leidet hat dies keinen Einfluss.

Ich poste das ganze mal auf rails-talk - also ein vorsichtes fup2 für
die, die
auch englisch sprechen :wink:

Keep smiling
yanosz

ja hallo erstmal,…

Am Montag, 31. Dezember 2007 schrieb Roland M.:

liegts evtl an transactional fixtures?

http://www.thirdbit.net/articles/2007/06/26/transactional-fixtures-in-rails
-a-head-banger/

Danke für den Tipp, aber leidet hat dies keinen Einfluss.

Alles Gute
Jan