自定义设计会话控制器的RSpec测试失败AbstractController :: ActionNotFound [英] RSpec Test of Custom Devise Session Controller Fails with AbstractController::ActionNotFound

查看:327
本文介绍了自定义设计会话控制器的RSpec测试失败AbstractController :: ActionNotFound的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正试图用rspec测试一个自定义Devise会话控制器。我的控制器看起来像这样:

I am currently trying to test a custom Devise session controller with rspec. My controller looks like this:

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控制器测试是这样:

My RSpec Controller Test is this:

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测试,它会失败,并显示以下行:

If I execute the RSpec Test it fails with the following line:

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

来自plataformatec Devise Wiki的提示以及此信息没有解决这个问题。非常感谢您的帮助。

Tips from the plataformatec Devise Wiki as well as this post did not solve this issue. Thanks for your help.

添加

我实际上能够删除错误与以下添加到控制器规格:

I investigated further. I was actually able to "remove" the error with the following addition to the controller spec:

before(:each) do
  request.env['devise.mapping'] = Devise.mappings[:user]
end

但现在出现一个新错误:

But now a new error appears:

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例如。它似乎是post:只创建。
我的想法?任何帮助?
谢谢!

Even with the create method left out in the inheriting controller the error appears. The error does not appear on get :new for example. It seems to be post :create only. I am out of ideas? Any help? Thanks!

推荐答案

我终于通过包括devise测试助手来修复我的问题,调用我的方法setup_controller_for_warden测试AND做request.env [devise.mapping] = Devise.mappings [:user]。像这样:

I finally fixed my problem by doing including the devise test helpers, calling the method setup_controller_for_warden in my test AND doing request.env["devise.mapping"] = Devise.mappings[:user]. Like so:

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应该如何工作。

Not sure about your double render problem though, are you sure your supposed to call post :create then render? i'm not sure how rspec is supposed to work.

这篇关于自定义设计会话控制器的RSpec测试失败AbstractController :: ActionNotFound的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆