Я выполняю функциональные тесты с Test :: Unit на моем приложении rails 3, которое использует Devise и CanCan для управления пользователями.Тем не менее, я сталкиваюсь со странной проблемой в моих запросах, когда я делаю POST или PUT для моего contacts_controller.Запрос не выполняется, когда контроллер загружает пользователя из базы данных, а затем останавливается, что приводит к неудачному тесту.
Кто-нибудь может понять, почему это происходит?
Консольный выход
SQL (2.8ms) describe `roles_users`
SQL (2.1ms) describe `camps_users`
SQL (3.4ms) describe `camps_users`
SQL (2.0ms) describe `campers_camps`
SQL (2.8ms) describe `campers_camps`
SQL (2.1ms) describe `roles_users`
Loaded suite test/functional/camp/contacts_controller_test
Started
SQL (0.1ms) BEGIN
SQL (0.7ms) SHOW TABLES
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE (`users`.`id` = 292811013) LIMIT 1
SQL (0.4ms) SELECT COUNT(*) FROM `contacts`
Camp Load (0.3ms) SELECT `camps`.* FROM `camps` WHERE (`camps`.`id` = 665138414) LIMIT 1
Processing by Camp::ContactsController#create as HTML
Parameters: {"contact"=>{"first_name"=>"John", "last_name"=>"Doe", "email_address"=>"test@test.com", "phone_number"=>"1234567890"}, "camp_id"=>"bolo"}
User Load (0.4ms) SELECT `users`.* FROM `users` WHERE (`users`.`id` = 292811013) LIMIT 1
Completed in 24ms
SQL (0.3ms) SELECT COUNT(*) FROM `contacts`
SQL (0.1ms) ROLLBACK
F
Finished in 0.385608 seconds.
1) Failure:
test_should_create_contact(Camp::ContactsControllerTest) [test/functional/camp/contacts_controller_test.rb:45]:
"Contact.count" didn't change by 1. <5> expected but was <4>.
1 tests, 1 assertions, 1 failures, 0 errors, 0 skips
Test run options: --seed 10895 --name "test_should_create_contact"
Проверка контакта
test "should create contact" do
assert_difference('Contact.count') do
post :create,
:contact => {
:first_name => "John",
:last_name => "Doe",
:email_address => "test@test.com",
:phone_number => "1234567890"
},
:camp_id => camps(:bolo).uri
end
assert_response :created
assert_not_nil assigns(:contact)
get :show,
:id => assigns(:contact).to_param,
:camp_id => camps(:bolo).uri
assert_response :success
end
Контроллер контактов
class Camp::ContactsController < AuthorizedController
def create
@contact = @camp.contacts.build(params[:contact])
respond_to do |format|
if @contact.save
format.html { render :text => "contact created!", :status => :created }
format.xml {render :xml => @contact, :status => :created, :location => @contact}
else
format.html { render :action => "new", :status => :bad_request }
format.xml { render :xml => @contact.errors, :status => :bad_request }
end
end
end
end
Авторизованный контроллер
class AuthorizedController < ApplicationController
before_filter :authenticate_user!
check_authorization
load_and_authorize_resource
rescue_from CanCan::AccessDenied do |exception|
flash[:error] = exception.message
respond_to do |format|
format.html { redirect_to new_user_session_path, :status => :unauthorized }
format.xml { render :xml => "...", :status => :unauthorized }
end
end
end
CanCan Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.role? :admin
can :manage, :all
elsif user.role? :account_admin
can [:show, :update, :destroy, :create], Camp do |camp|
user.is_linked_to_camp?(camp)
end
can :manage, Contact do |contact|
user.is_obj_linked_to_camp?(contact)
end
else
cannot :manage, :all
end
end