我是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,但它根本没有帮助)
答案 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