2012-04-02 83 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