簡體   English   中英

在Rails4 / Capybara / Rspec3中測試sidekiq WebUI可達性

[英]Testing sidekiq WebUI reachability in Rails4/Capybara/Rspec3

我目前正在將一些功能測試從Minitest移至RSpec。 我的最后一個問題是到達我在routes.rb啟用的Sidekiq WebUI

require 'sidekiq/web'
require 'admin_constraint'

Rails.application.routes.draw do
  mount Sidekiq::Web => '/sidekiq', constraints: AdminConstraint.new
  ...
end

資源受管理員保護,我現在要測試。 我有兩個問題

1)再次考慮該測試使我開始思考,是否可以將其更好地表述為路由測試。 你怎么看? 請記住,它路由到外部引擎,這可能會使它更加復雜。 功能測試似乎是解決此問題的簡便方法(只需測試資源是否可訪問)。

2)在Minitest中,我可以執行以下操作,但效果很好

require_relative '../test_helper'

feature 'Sidekiq dashboard' do
  scenario 'Dashboard cannot be reached as guest user' do
    assert_raise ActionController::RoutingError do
      visit sidekiq_web_path
    end
  end

  scenario 'Dashboard cannot be reached as regular user' do
    login_as_user

    assert_raise ActionController::RoutingError do
      visit sidekiq_web_path
    end
  end

  scenario 'Dashboard can be reached as admin' do
    login_as_admin
    assert_nothing_raised do
      visit sidekiq_web_path
    end
  end
end

我試圖像這樣直接將其轉換為RSpec

scenario 'Dashboard can be reached as user' do
  login_as_user

  expect {
    visit sidekiq_web_path
  }.to raise_error(ActionController::RoutingError)
end

產生以下錯誤

Failures:

  1) Sidekiq dashboard Dashboard cannot be reached as regular user
     Got 1 failure and 1 other error:

     1.1) Failure/Error:
            expect {
              visit sidekiq_web_path
            }.to raise_error(ActionController::RoutingError)

            expected ActionController::RoutingError but nothing was raised
          # ./spec/features/sidekiq_monitoring_spec.rb:12:in `block (2 levels) in <top (required)>'

     1.2) Failure/Error: raise ActionController::RoutingError, "No route matches [#{env['REQUEST_METHOD']}] #{env['PATH_INFO'].inspect}"

          ActionController::RoutingError:
            No route matches [GET] "/sidekiq"
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/railties-4.2.7.1/lib/rails/rack/logger.rb:38:in `call_app'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/railties-4.2.7.1/lib/rails/rack/logger.rb:20:in `block in call'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/railties-4.2.7.1/lib/rails/rack/logger.rb:20:in `call'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/request_store-1.3.2/lib/request_store/middleware.rb:9:in `call'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/rack-1.6.5/lib/rack/methodoverride.rb:22:in `call'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/rack-1.6.5/lib/rack/runtime.rb:18:in `call'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/rack-1.6.5/lib/rack/lock.rb:17:in `call'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/rack-1.6.5/lib/rack/sendfile.rb:113:in `call'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/railties-4.2.7.1/lib/rails/engine.rb:518:in `call'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/railties-4.2.7.1/lib/rails/application.rb:165:in `call'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/rack-1.6.5/lib/rack/urlmap.rb:66:in `block in call'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/rack-1.6.5/lib/rack/urlmap.rb:50:in `each'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/rack-1.6.5/lib/rack/urlmap.rb:50:in `call'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/capybara-2.12.0/lib/capybara/server.rb:43:in `call'
          # /home/blubber/.rvm/gems/ruby-2.3.1/gems/rack-1.6.5/lib/rack/handler/webrick.rb:88:in `service'
          # ------------------
          # --- Caused by: ---
          # Capybara::CapybaraError:
          #   Your application server raised an error - It has been raised in your test code because Capybara.raise_server_errors == true
          #   /home/blubber/.rvm/gems/ruby-2.3.1/gems/capybara-2.12.0/lib/capybara/session.rb:129:in `raise_server_error!'

為什么這在RSpec中不起作用?

在此先感謝您,Andi

使用支持JS的驅動程序(poltergeist等)進行測試時,Capybara在單獨的服務器線程中運行該應用程序。 因此,應用程序中引發的錯誤不會自動出現在測試代碼中。 為了克服該問題,Capybara將所有引發的錯誤存儲在服務器中,並且由於使用支持JS的驅動程序時命令的異步特性,因此下次嘗試與Capybara進行交互時會在測試代碼中重新引發它們。 因此,您需要在塊內進行第二次交互,以期望引起錯誤

expect {
  visit sidekiq_web_path
  expect(page).to have_text("Something")  # the error will actually raise here
}.to raise_error(ActionController::RoutingError)

我不知道為什么它以minitest的方式為您工作,並且不得不去看看Minitest的代碼以試圖找出原因。 如果您使用rack_test驅動程序運行那些測試,我希望您的測試能夠正常工作,因為它沒有運行單獨的線程,而只是直接調用應用程序(盡管您聲稱並沒有改變)。

注意:這實際上不是您應該在功能測試中檢查的事情,而是最好在拒絕/允許權限時檢查頁面上顯示的內容,而不是引發特定的錯誤類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM