0

紅寶石2.2.0 Rails的4.2 設計-3.4.1 Declarative_Authorization-0.5.7設計註銷 - 黃瓜步驟失敗,但應用程序運行正常

我轉換一個Rails-3.2應用的Rails -4- 。該應用程序採用設計認證和聲明授權。我正在使用默認的Devise控制器。

在這個時候,我的大部分認證方案都通過了。然而,我遇到的是,我不能通過黃瓜註銷,但我可以在瀏覽器中註銷。有問題的步驟如下:

When /select end the current session/ do 
    selector_type = "#" 
    selector_value = link = "session_end_action_id" 
    selector = selector_type + selector_value 
    click_button(selector_value) 
end 

的路線是這樣的:

. . . 
        new_user_session GET /users/sign_in(.:format)          devise/sessions#new 
         user_session POST /users/sign_in(.:format)          devise/sessions#create 
       destroy_user_session DELETE /users/sign_out(.:format)          devise/sessions#destroy 
        user_password POST /users/password(.:format)          devise/passwords#create 
       new_user_password GET /users/password/new(.:format)         devise/passwords#new 
       edit_user_password GET /users/password/edit(.:format)         devise/passwords#edit 
            PATCH /users/password(.:format)          devise/passwords#update 
            PUT /users/password(.:format)          devise/passwords#update 
         user_unlock POST /users/unlock(.:format)           devise/unlocks#create 
        new_user_unlock GET /users/unlock/new(.:format)          devise/unlocks#new 
            GET /users/unlock(.:format)           devise/unlocks#show 
          account POST /account(.:format)            users#create 
         new_account GET /account/new(.:format)           users#new 
         edit_account GET /account/edit(.:format)           users#edit 
            GET /account(.:format)            users#show 
            PATCH /account(.:format)            users#update 
            PUT /account(.:format)            users#update 
            DELETE /account(.:format)            users#destroy 
         authenticate GET /authenticate(.:format)           devise/sessions#new 

. . . 

        users#index 
            POST /users(.:format)            users#create 
          new_user GET /users/new(.:format)           users#new 
         edit_user GET /users/:id/edit(.:format)          users#edit 
           user GET /users/:id(.:format)           users#show 
            PATCH /users/:id(.:format)           users#update 
            PUT /users/:id(.:format)           users#update 
            DELETE /users/:id(.:format)           users#destroy 

. . . 

視圖中的代碼如下所示:

<%-if current_user-%> 
    <span class="authenticated_session" id="authenticated_session"> 
    <%=button_to(I18n.t(:session_end).strip.titleize, 
     :destroy_user_session, 
     :class => "button logout", 
     :confirm => I18n.t(:session_end_confirm).strip.titleize, 
     :id => :session_end_action_id, 
     :method => :delete, 
     :title => I18n.t(:session_end_logout).strip.titleize)-%> 
    </span 
<%-else-%> 
    <%=button_to(I18n.t(:session_start).strip.titleize, 
     :new_user_session, 
     :class => "button login", 
     :id => :session_start_action_id_top, 
     :method => :get, 
     :title => I18n.t(:session_start_login).strip.titleize)-%> 
<%-end-%> 

當我經過身份驗證,然後按註銷按鈕,然後我註銷。當我運行黃瓜步驟時,我從聲明授權中獲得授權錯誤。

<p class='security classified' style='color: orangered'> 
     you are not authorised to access the requested resource</p>  
    <br/> 
    <!-- End of header section from layouts/application.html.erb --> 

這是這裏生成在應用控制器:

def permission_denied 
    if current_user 
    flash[:security_classified] = I18n.t(:security_classified).strip 
    else 
    flash[:security_restricted] = I18n.t(:security_restricted).strip 
    end 
    redirect_back_or_default(welcome_url) 
end 

並且顯然被從用戶控制器稱爲:

User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 21]] 

    Rendered public/hll_authorisation_notice.html (0.1ms) 

    Rendered welcome/show.html.erb within layouts/application (3.6ms) 
Completed 200 OK in 105ms (Views: 100.4ms | ActiveRecord: 0.6ms) 

Started DELETE "https://stackoverflow.com/users/sign_out" for 127.0.0.1 at 2015-01-26 15:19:48 -0500 

Processing by UsersController#destroy as HTML 
    Parameters: {"id"=>"sign_out"} 
    (0.2ms) SELECT COUNT(*) FROM "users" 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 21]] 
    CACHE (0.0ms) SELECT COUNT(*) FROM "users" 
    Role Load (0.4ms) SELECT "roles".* FROM "roles" INNER JOIN "clearances" ON "roles"."id" = "clearances"."role_id" WHERE "clearances"."user_id" = ? [["user_id", 21]] 
    CACHE (0.0ms) SELECT COUNT(*) FROM "users" 

Redirected to http://www.example.com/welcome 
Filter chain halted as :filter_access_filter rendered or redirected 
Completed 302 Found in 23ms (ActiveRecord: 1.0ms) 

Started GET "/welcome" for 127.0.0.1 at 2015-01-26 15:19:48 -0500 
Processing by WelcomeController#show as HTML 
    (0.2ms) SELECT COUNT(*) FROM "users" 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 21]] 

    Rendered public/hll_authorisation_notice.html (0.1ms) 

    Rendered welcome/show.html.erb within layouts/application (1.5ms) 
Completed 200 OK in 61ms (Views: 57.2ms | ActiveRecord: 0.4ms) 
    (0.4ms) rollback transaction 

檢查(重新格式化用於此目的)的對象在permission_denied方法中顯示:

#<UsersController:0x00000006ba52d8 @_action_has_layout=true, 
@_routes=nil, @_headers={"Content-Type"=>"text/html"}, @_status=200, 
@_request=#<ActionDispatch::Request:0x00000006ba51c0 
@env={"rack.version"=>[1, 3], "rack.input"=>#<StringIO:0x00000006c378e0>, 
"rack.errors"=>#<StringIO:0x00000006c379a8>, "rack.multithread"=>false, 
"rack.multiprocess"=>true, "rack.run_once"=>false, 
"REQUEST_METHOD"=>"DELETE", "SERVER_NAME"=>"www.example.com", 
"SERVER_PORT"=>"80", "QUERY_STRING"=>"", "PATH_INFO"=>"https://stackoverflow.com/users/sign_out", 
"rack.url_scheme"=>"http", "HTTPS"=>"off", "SCRIPT_NAME"=>"", 
"CONTENT_LENGTH"=>"14", "rack.test"=>true, "REMOTE_ADDR"=>"127.0.0.1", 
"HTTP_REFERER"=>"http://www.example.com/", 
"HTTP_HOST"=>"www.example.com", 
"CONTENT_TYPE"=>"application/x-www-form-urlencoded", 
"HTTP_COOKIE"=>"_proforma_session=. . . 

所以,這絕對是用戶控制器的一個問題。但是在黃瓜運行期間只會遇到錯誤。當我使用Rails服務器爲應用程序提供服務並從瀏覽器訪問它時,登錄並註銷,然後我登出而不出現任何錯誤,如下面的日誌摘錄中所示。

Started DELETE "https://stackoverflow.com/users/sign_out" for ::1 at 2015-01-26 15:45:50 -0500 
Processing by Devise::SessionsController#destroy as HTML 
    Parameters: {"authenticity_token"=>"Xl9Ui1a6jt8gyjZOuh0lsefUqFI1eEunaXivaEdfwWhMofYhYbRumnZlsRQjwmjWiC1C7sI7O3FwDgEf9lJzJw=="} 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]] 
    (0.2ms) SELECT COUNT(*) FROM "users" 
    (0.1ms) begin transaction 
    (0.4ms) UPDATE "users" SET "accessed_at" = '2015-01-26 20:45:50.179843', "changed_at" = '2015-01-26 20:45:50.180748', "lock_version" = 20 WHERE ("users"."id" = 1 AND "users"."lock_version" = 19) 
    (103.2ms) commit transaction 
Redirected to http://localhost:3000/ 

有沒有人有任何想法可能會發生什麼?瀏覽器sign_out中的令牌值是否顯着?

P.S.如果我只是這樣做:

visit('/users/sign_out') 

然後該步驟通過。我在這裏做了一個瘋狂的猜測,但是有沒有關於RoR中用於html按鈕的javscript的任何信息,可能會導致我所看到的?

+0

你看過明顯的,當你運行黃瓜一步你沒有登錄! – diabolist 2015-01-29 12:13:58

+0

是的,測試已登錄。只有經過身份驗證,才能獲得授權錯誤。 – 2015-01-29 21:07:44

回答

0

我認爲我發現了什麼是錯的;意外地研究一個不同的和不相關的問題。

我相信這個問題是由水豚使用的默認測試方法:

https://github.com/jnicklas/capybara#selecting-the-driver

默認情況下,水豚使用:rack_test驅動程序,這是快,但 有限的:它不支持JavaScript ,也不能訪問Rack應用程序外部的HTTP 資源,例如遠程API和OAuth服務。爲了解決這些限制,您可以爲您的功能設置不同的默認驅動程序。例如,如果你最好 喜歡運行硒的一切,你可以這樣做:

Capybara.default_driver = :selenium

但是,如果你正在使用RSpec的或黃瓜,你可以改爲要 考慮離開的更快:rack_test default_driver和 分別只標記那些需要支持JavaScript的驅動程序 使用:js => true@javascript的測試。默認情況下, JavaScript測試使用:selenium driver運行。您可以通過設置Capybara.javascript_driver來更改此設置。

您也可以臨時更改驅動程序(通常在 /安裝前,後/拆卸模塊):

Capybara.current_driver = :webkit # temporarily select different driver ... tests ... Capybara.use_default_driver # switch back to default driver

注:切換驅動程序創建一個新的會話,所以您可能不是 能夠在測試過程中切換。