Rails 3 - richtige test für die Methode mit rspec
Habe ich Modell TeacherLeader hält fremden Schlüssel für andere Tabellen. Ich kann eine Aktualisierung dieser Tabelle und ich versuche zu schreiben tests für meinen controller (via rspec).
Mein Modell:
# id :integer not null, primary key
# user_id :integer
# teacher_id :integer
#
class TeacherLeader < ActiveRecord::Base
belongs_to :user
belongs_to :teacher
validates :teacher_id,
:uniqueness => { :message => "already a class-head" }
end
Mein controller
class TeacherLeadersController < ApplicationController
def edit
@teacher_leader = TeacherLeader.find( params[:id] )
...
end
def update
@teacher_leader = TeacherLeader.find( params[:id] )
...
if ( @teacher_leader.update_attributes( params[:teacher_leader] ) )
redirect_to teachers_path
...
else
redirect_to edit_teacher_leader_path
...
end
end
end
end
So, ich habe Probleme mit dem schreiben von tests für. Hier ist zum Beispiel mein code für die PUT-Methode:
describe TeacherLeadersController do
render_views
before(:each) do
@teacher = Factory( :teacher )
@teacher.user.user_role = "teacher"
@teacher.save!
@user = Factory( :user, :user_login => Factory.next(:user_login) )
@user.user_role = "class_head"
@user.save!
@sh = Factory( :user, :user_login => Factory.next(:user_login) )
@sh.user_role = "school_head"
@sh.save!
end
describe "PUT 'update" do
before(:each) do
@teacher_leader = @user.create_teacher_leader( @attr_teacher_leader )
end
describe "for signed-in school-heads" do
before(:each) do
test_sign_in( @sh )
end
it "should update teacher leader with correct params" do
put :update, :id => @teacher_leader, :teacher_id => @teacher.id
@teacher_leader.reload
@teacher_leader.teacher_id.should == @teacher.id
end
end
end
end
Wenn ich versuche zu laufen, meine Angaben habe ich bekommen:
1) TeacherLeadersController PUT 'update for signed-in school-heads should update teacher leader with correct params
Failure/Error: put :update, :id => @teacher_leader, :teacher_id => @teacher.id
NoMethodError:
undefined method `[]' for nil:NilClass
# ./app/controllers/teacher_leaders_controller.rb:57:in `update'
# ./spec/controllers/teacher_leaders_controller_spec.rb:150:in `block (4 levels) in <top (required)>'
Aber mein Programm funktioniert! Was mache ich in tests falsch?
- Kann
put :update, :id => @teacher_leader.id, ...
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem controller erwartet einen
params[:teacher_leader]
hash, aber dein test nicht liefern. Versuchen Sie dies:Stellen Sie sicher, wenn Sie Ihre Spezifikationen sind eingewickelt mit
describe TeacherLeadersController
block. Zum Beispiel:..dann sollten Sie in der Lage sein zu verwenden
put
Methode richtig.Außerdem haben Sie vergessen, pass
:teacher_leader
Attribute der controller unter dem test. Versuchenput :update, :id => something, :teacher_leader => { some_attributes_here }
Trotzdem empfehle ich dringend, Sie zu verspotten, alle Datenbank-Abfragen (active-record-Aufrufe) in der controller-Spezifikationen. Für die Prüfung, ob die Parameter gespeichert werden, die Sie verwenden sollten Anfragen, die Spezifikationen (oder eine andere Methode, das zu tun-integration - /acceptance-tests). Siehe zum Beispiel: http://blog.bandzarewicz.com/slides/krug-the-perfect-rspec/#27