RSpec Test для пользовательского разработчика Session Session Control не работает с AbstractController:: ActionNotFound
В настоящее время я пытаюсь протестировать пользовательский контроллер сеанса разработки с помощью rspec. Мой контроллер выглядит так:
class SessionsController < Devise::SessionsController
def create
#valid email?
if !(params[:email] =~ /^[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,}$/)
set_flash_message :notice, "Please enter a valid e-mail address!"
end
super
end
end
My RSpec Controller Test:
require 'spec_helper'
require 'devise/test_helpers'
describe SessionsController do
it "should put a warning on invalid mail address login attempt" do
post :create, :user => {:email => 'invalidEmailAddress'}
response.should contain "Please enter a valid e-mail address!"
end
it "should put no warning on valid mail address login attempt" do
pending
end
end
Если я выполняю RSpec Test, он не работает со следующей строкой:
Failure/Error: post :new, :user => {:email => 'invalidEmailAddress'}
AbstractController::ActionNotFound
# ./spec/controllers/sessions_controller_spec.rb:7
Подсказки из wiki-платформы plataformatec, а также этот пост не решают эту проблему. Благодарим за помощь.
Добавление
Далее я исследовал. Я действительно смог "удалить" ошибку со следующим дополнением к спецификации контроллера:
before(:each) do
request.env['devise.mapping'] = Devise.mappings[:user]
end
Но теперь появляется новая ошибка:
Failure/Error: post :create #currently fails with multiple render warning
Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".
Даже при отсутствии метода создания в наследующем контроллере появляется ошибка. Ошибка не появляется в get: new, например. Кажется, это сообщение: create only.
У меня нет идей? Любая помощь?
Спасибо!
Ответы
Ответ 1
Я, наконец, исправил свою проблему, выполнив, в том числе, тестовые помощники разработки, вызвав метод setup_controller_for_warden в своем тесте И выполнив request.env [ "devise.mapping" ] = Devise.mappings [: user]. Например:
require 'test_helper'
class SessionsControllerTest < ActionController::TestCase
include Devise::TestHelpers
test "should reject invalid captcha" do
setup_controller_for_warden
request.env["devise.mapping"] = Devise.mappings[:user]
get :new
assert_response :success
end
end
Не уверен в вашей двойной проблеме с рендерингом, правда, вы уверены, что вы должны назвать post: create then render? Я не уверен, как работает rspec.