gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:12:25 26 4
gpt4 key购买 nike

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

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

devise_for :admins

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

它(显然)完美地工作:如果我访问 /admin , 我被重定向到 /admins/sign_in而且,一旦我登录(或者如果我已经在 session 中),我就可以直接访问 /admin .

现在,据我了解,应该在 spec/routes/<controller_name>_routes_spec.rb 内测试路由.我喜欢自行测试路由(以及正确的 Controller 以正确的操作处理每条路由等)的想法。

当上述路线为 authenticate 时,我们面临测试路线的问题d.包括

config.include Devise::TestHelpers[, type: :controller]

内部spec/spec_helper.rb仍然没有制作 sign_in (或 sign_[out|up] )路由规范中可用的方法。

我们该怎么办?我们应该如何测试经过身份验证的路由?对我来说,未经身份验证的路由被测试为 spec/routes 感觉不对,而经过身份验证的路由应该在集成测试中进行测试,用类似 capybara 的东西手动填写登录表单。

(注意:我读了 this ,但完全没有帮助)

最佳答案

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

...

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

或者,如果您想确保您没有在奇怪的地方滥用设计,您可以将其仅包含在 Controller 和路由测试中。

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

...

end

这一切都假设您正在输入规范文件。我的一个路由文件如下所示:

需要“spec_helper”

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

关于ruby-on-rails - 我应该在哪里使用 Devise + RSpec 进行经过身份验证的路由测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21999967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com