Testing Part1: Rails
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?