我应该在哪里使用Devise + RSpec进行经过身份验证的路由测试?

时间:2014-02-24 21:59:33

标签: ruby-on-rails ruby authentication rspec devise

我是Rails的新手。 我们使用Devise来处理用户身份验证和RSpec来测试应用程序(Rails 4)。

我有一个Admin设计模型,可以访问一些经过身份验证的路由。以下是routes.rb的摘录:

devise_for :admins

authenticate :admin do
  get 'admin', to: 'admin#index'
end

它(显然)完美无缺:如果我访问/admin,我会被重定向到/admins/sign_in,一旦我登录(或者如果我已经在会话中),我可以直接访问{{ 1}}。

现在,据我所知,路由应该在/admin内进行测试。我喜欢自己测试路线(以及正确的控制器使用正确的动作等处理每条路线)的想法。

当所述路线为spec/routes/<controller_name>_routes_spec.rb d时,我们面临测试路线的问题。包括

authenticate
<{1}}内部的

仍未使路线规范中的config.include Devise::TestHelpers[, type: :controller] (或spec/spec_helper.rb)方法可用。

我们该怎么办?我们应该如何测试经过验证的路由? 我认为非认证路由被测试为sign_in,而经过认证的路由应在集成测试中进行测试,手动填写与Capybara类似的东西的登录表单。

注意:我看过this,但它根本没有帮助)

1 个答案:

答案 0 :(得分:0)

您可以通过删除spec_helper配置中的条件来在路径控制器中包含设计助手。我看起来像这样:

...

RSpec.configure do |config|
  config.include Devise::TestHelpers

...

end

def sign_in_user( user=nil )
  @user = FactoryGirl.build(:user)
  @user.skip_confirmation!
  @user.save!
  sign_in @user
end

或者如果你想确保你不会在怪异的地方滥用设计,你可以将它包含在控制器和路由测试中。

RSpec.configure do |config|
  config.include Devise::TestHelpers, type: :controller
  config.include Devise::TestHelpers, type: :routing

...

end

这就是假设您正在键入规范文件。我的一个路由文件如下所示:

要求&#34; spec_helper&#34;

RSpec.describe WidgetsController, :type => :controller do
  describe "routing" do

    before(:each) do 
      sign_in_user
    end

    it "routes to #index" do
      expect(:get => "/widgets").to route_to("widgets#index")
    end

    it "routes to #new" do
      expect(:get => "/widgets/new").to route_to("widgets#new")
    end

    it "routes to #show" do
      expect(:get => "/widgets/1").to route_to("widgets#show", :id => "1")
    end

    it "routes to #edit" do
      expect(:get => "/widgets/1/edit").to route_to("widgets#edit", :id => "1")
    end

    it "routes to #create" do
      expect(:post => "/widgets").to route_to("widgets#create")
    end

    it "routes to #update" do
      expect(:put => "/widgets/1").to route_to("widgets#update", :id => "1")
    end

    it "routes to #destroy" do
      expect(:delete => "/widgets/1").to route_to("widgets#destroy", :id => "1")
    end
  end
end