使用activeadmin进行Rails测试

时间:2015-04-02 14:56:55

标签: ruby-on-rails testing activeadmin minitest

我在我的Rails项目中使用activeadmin,我想知道如何对它进行测试。我查看了互联网,但没有关于它的文档。 我有一个设置资源,我禁用了创建新资源或删除它的可能性。

我想知道如何测试这些路线不存在或以其他方式确保它无法访问。 在我的实际,虽然我试图断言这个页面是一个404,但测试似乎抛出这个错误(这是我试图测试!!!):ActionController::UrlGenerationError: No route matches {:action=>"new", :controller=>"admin/settings"}

我不使用Rails中的Rspec而是Minitest 谢谢你的帮助!

我的activeadmin文件

ActiveAdmin.register Setting do
    actions :all, except: [:new, :destroy]
    …
end

我的测试

require 'test_helper'

class Admin::SettingsControllerTest < ActionController::TestCase
   include Devise::TestHelpers
   setup :initialize_settings

   test 'should throw 404 if trying to access new action' do
     get :new
     assert_response 404
   end

   def initialize_settings
     sign_in users(:one)
   end
end

我的项目

  • Rails 4.2
  • Ruby 2.2.0
  • Minitest(不是RSPEC)

1 个答案:

答案 0 :(得分:0)

您需要的是集成测试,特别是测试路线的测试,或者在您的情况下,测试路线的缺失。不存在的操作将引发ActionController::RoutingError

# test/routes/admin/settings_test.rb
require 'test_helper'

class Admin::SettingsRouteTest < ActionDispatch::IntegrationTest  
  test 'create' do
    assert_raises(ActionController::RoutingError) do
      post '/admin/settings'
    end
  end

  test 'destroy' do
    assert_raises(ActionController::RoutingError) do
      delete '/admin/settings/1'
    end
  end

  test 'edit' do
    assert_routing '/admin/settings/1/edit', controller: 'admin/settings', action: 'edit', id: '1'
  end

  test 'index' do
    assert_routing '/admin/settings', controller: 'admin/settings', action: 'index'
  end

  test 'new' do
    assert_routing '/admin/settings/new', controller: 'admin/settings', action: 'show', id: 'new'
  end

  test 'update' do
    assert_routing({ method: 'patch', path: '/admin/settings/1' }, { controller: 'admin/settings', action: 'update', id: '1' })
  end
end

请注意,new操作会回退到ID为&#39; new&#39;的show操作。

观察:如果要删除:new操作,您可能还要删除:create操作,以便不能通过该路由创建任何记录。

# app/admin/setting.rb
ActiveAdmin.register Setting do
  actions :all, except: [:new, :create, :destroy]
end