Тест RSpec пользовательского устройства разработки сеанса завершается неудачей с AbstractController :: ActionNotFound - PullRequest
16 голосов
/ 27 ноября 2010

В настоящее время я пытаюсь протестировать пользовательский контроллер сеанса Devise с помощью rspec. Мой контроллер выглядит так:

class SessionsController < Devise::SessionsController

  def create 
    #valid email?
    if !(params[:email] =~ /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/)
      set_flash_message :notice, "Please enter a valid e-mail address!"
    end

    super
  end
end

Мой тест контроллера RSpec:

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, он завершится неудачно со следующей строкой:

Failure/Error: post :new, :user => {:email => 'invalidEmailAddress'}
     AbstractController::ActionNotFound
     # ./spec/controllers/sessions_controller_spec.rb:7

Советы от разработчиков вики-платформ, а также в этом посте не решили эту проблему. Спасибо за вашу помощь.

Добавление

Я исследовал дальше. Я действительно смог «убрать» ошибку следующим дополнением к спецификации контроллера:

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".

Даже при отсутствии метода create в наследующем контроллере появляется ошибка. Ошибка не появляется на get: new, например. Вроде бы пост: только создавать. У меня нет идей? Любая помощь? Спасибо!

1 Ответ

18 голосов
/ 01 декабря 2010

Я наконец исправил свою проблему, включив помощников теста devise, вызвав метод 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.

...