Bisher habe ich mich davor gedrückt Tests zu schreiben, aber da komme ich nicht länger drumherum.
Das sinnvollste wird wohl sein, alles was ich von Hand teste, mit automatische Tests abzudecken. Customer und Rating anlegen, Fakten eintragen, löschen, usw...
Da ich mich mit Tests noch nicht so auskenne, fange ich dieses Mal mit Rails an, da hier der Einstieg ins Testing einfacher scheint.
Hier erstmal ein paar nützliche Links:
http://manuals.rubyonrails.com/read/book/5
http://nubyonrails.com/articles/ruby-rails-test-rails-cheat-sheet
Nun bringt ein Blick in das Buch "The Railsway" doch Zweifel, ob ich nicht besser das plugin RSpec zum Testen verwenden sollte. So würde ich damit den eigentlichen vorgesehenen Weg von Rails verlassen und das sollte in meinem Vergleich eigentlich nicht passieren. Ich werde mich also mit den mitgelieferten Testmöglichkeiten auseinandersetzen.
Rails hat automatisch schon einige Tests angelegt und da dort zB die später hinzugefügte Validierung noch nicht berücksichtigt wird, bekam ich beim ersten Durchlauf auch jede Menge Fehler.
Die habe ich jetzt repariert, aber es bleiben 2 Tests übrig, die einfach nicht funktionieren wollen. Da brauche ich mal eure Hilfe, denn ich komme einfach nicht weiter...
Also... Hier ein Test, der funktioniert:
def test_should_destroy_rating
assert_difference('Rating.count', -1) do
delete :destroy, :id => ratings(:one).id
end
assert_redirected_to ratings_path
end
Die Fixture dazu:
one:
date: 2008-01-10 02:30:05
rating: 5000
status: COMPLETED
customer: one
Die DB-Tabelle sieht so aus:
create_table :ratings do |t|
t.datetime :date
t.integer :rating
t.string :status
t.references :customer
t.timestamps
end
Alles wunderbar und jetzt der Test, der nicht funktioniert:
def test_should_destroy_fact_type
assert_difference('FactType.count', -1) do
delete :destroy, :id => fact_types(:fact_type_1).id
end
assert_redirected_to fact_types_path
end
Die Fixture dazu (im moment als csv, habe es aber auch schon als yaml gehabt. gleicher fehler:
id,factCategory_id,title,question,question_type
1,2,"Alter des Kunden","Wie alt ist der Kunde?","FREE"
Die DB-Tabelle sieht so aus:
create_table :fact_types do |t|
t.string :title
t.text :question
t.string :question_type
t.references :factCategory
t.timestamps
end
Die Fehlermeldung ist:
MySQL Error: #42S22Unknown column 'facts.fact_type_id' in 'where clause': SELECT * FROM `facts` WHERE (facts.fact_type_id = 1)
Das kann auch nicht funktionieren, weil anstatt "fact_type_id" müsste rails einfach nur die column "id" in der where-clause verwenden. Beim rating klappt das doch auch!? Warum hier nicht? Den einzigen Unterschied den ich sehe ist der Unterstrich im Tabellennamen...
Was übersehe ich?
Comments (2)
Okay, folgendes habe ich übersehen. Das SQL-Statement operiert auf der facts-Tabelle, weil zu dem fact_type, den ich löschen will, facts eingetragen sind.
Nur ist die column "fact_type_id" trotzdem falsch, denn richtig heißt es "factType_id", was zugegeben ein komischer Mischmasch zwischen 2 Notationen ist. In der Migration steht t.references "factType". Muss es dort "fact_type" heißen? Meiner Meinung nach eigentlich nicht. Vielleicht ist dies ein kleiner Bug in der SexyMigration-Implementierung?
So, ich hab es geändert in "t.references fact_type_id" und der Test geht jetzt. (jetzt funktionieren zwar ein paar andere nicht mehr, aber das sollte kein Problem sein.)
Also Obacht! Bei t.references zwar die Einzahl benutzen, aber mit Unterstrichen! (Im Gegensatz zu dem Model in dem man "belongs_to :factType" benutzt)
Posted by Gerald Schenke | 05.03.08 15:51
Posted on 05.03.08 15:51
Es ist doch nicht so einfach.
Denn jetzt funktioniert die Rails-Magic nicht mehr. @fact.factType liefert jetzt immer nil, weil er factType_id nicht findet. (da ich es ja geändert habe.)
Es ist also ein Bug, oder?
Posted by Gerald Schenke | 05.03.08 16:16
Posted on 05.03.08 16:16