2012-04-02 43 views
3

我有這樣的步驟定義:的Rails:黃瓜+水豚 - 如何添加訪問HTTP方法()

Given /^I am not logged in$/ do 
    visit '/users/sign_out' 
end 

而且耙路線給了我這樣的:

destroy_user_session DELETE /users/sign_out(.:format)  devise/sessions#destroy 

所以..我如何測試這個?有什麼方法可以在Capybara中添加HTTP方法嗎?

我這樣說是因爲我一直在我的測試中得到這個錯誤:

No route matches [GET] "https://stackoverflow.com/users/sign_out" (ActionController::RoutingError) 

回答

8

變化:

config.sign_out_via = :delete 

config/initializers/devise.rb

config.sign_out_via = Rails.env.test? ? :get : :delete 

Rails-Devise-Rspec-Cucumber tutorial解釋說,這樣做,你會做設計做GET爲登出行動的請求。而這僅僅是要在測試環境中發生......

+0

現在,鏈接的文檔似乎在付費牆後面 – ABMagil 2014-09-29 13:57:38

1

有幾件事情怎麼回事。

  1. 您有一個定義狀態的步驟,但實現正在執行一個操作。我期望一步斷言您還沒有登錄,是這樣的:

    current_path.should eq(home_url) 
    
  2. visit方法只會發出GET請求。 RackTest將模擬的刪除請求,如果你給它一個鏈接,所以執行sign_out動作,你會想用瀏覽器來模擬它:

    within('nav') { click_on('Logout') } 
    

    另外,您可以在Rack::Test::Methods混合,然後直接使用delete

    World(Rack::Test::Methods) 
    
    Given /^I am not logged in$/ do 
        delete '/users/sign_out' 
    end 
    

在正確性(如用戶真正註銷的方式)和速度之間進行權衡,完全不加載頁面。您必須選擇哪種方式適合您的場景,以及您將多久使用一次該步驟。

+0

嗨pselbert。我想點擊註銷,但問題是如果用戶沒有登錄,我甚至沒有顯示註銷鏈接,因此我無法註銷。 – 2012-04-08 19:14:29

0

要擴大Nobita's answer,如果你覆蓋了設計的默認路由,那麼你就需要編輯routes.rb還有:

as :user do 
    # Sample custom routes 
    get '/register' => 'devise/registrations#new', as: :new_user_registration 
    post '/register' => 'devise/registrations#create', as: :user_registration 
    get '/login' => 'devise/sessions#new', as: :new_user_session 
    post '/login' => 'devise/sessions#create', as: :user_session 
    get '/my-account' => 'devise/registrations#edit', as: :edit_user_registration 
    # This tells the test environment that GETting the logout path is OK 
    if Rails.env.test? 
    get '/logout' => 'devise/sessions#destroy', as: :destroy_user_session 
    else 
    delete '/logout' => 'devise/sessions#destroy', as: :destroy_user_session 
    end 
end