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:inwrite_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:insend
/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:inbefore_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

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs