1

Webratを使用してSinatraベースのアプリケーションのCucumberテストを作成しています。一部のテストでは、次のようなシナリオを実装する必要があります

Given I am logged in as admin
When I am visiting "/"
Then I should see "Settings" 

私はこのようなステップを定義します:

Given /^I am logged in as "(.+)"$/ do |user|
    visit "/login"
    fill_in "login", :with => user
    fill_in "password", :with => "123456"
    click_button "Login"
end

When /^I am viewing "(.+)"$/ do |url|
    visit(url)
end

Then /^I should see "(.+)"$/ do |text|
    response_body.should =~ /#{text}/
end

成功するとCookieが作成されます

response.set_cookie(cookie_name, coockie_value)

次に、ユーザーがヘルパーメソッドを介して管理ページにアクセスしようとしたときにビューで確認されます。

def logged_in?
    request.cookies[cookie_name] == cookie_value
end

そして、WebratはCookieを保存していないようです。テストではエラーは報告されませんが、「logged_in?」Cookieが保存されなかったように、ビュー内は常にfalseです。

私は何か間違ったことをしていますか?これがWebratの動作方法である場合、最善の回避策は何ですか?

4

3 に答える 3

1

本当の問題は、Sinatra がテスト環境でセッションを処理する方法です。Google グループでディスカッションを検索してください。ただし、実際の解決策は単純に次を使用することです。

use Rack::Session::Cookie

はない

enable :sessions

Selenium を使用するのは良いことですが、OP の問題の解決策としてはやり過ぎです。

于 2010-01-27T17:30:06.380 に答える
0

回避策は、SeleniumバックエンドでWebratを使用することです。すべてのテストを別のFirefoxウィンドウで実行するため、CookieやJavaScriptは問題になりません。欠点は、Firefoxを実行し、実際のクリックやレンダリングなどをすべて実行するために必要な余分な時間とリソースです。

于 2009-03-26T13:32:24.530 に答える
0

「与えられた /^I はログインしています」というステップ ハックが発生する可能性がありますlogged_in?

Given /^I am logged in as "(.+)"$/ do |user|
    visit "/login"
    fill_in "login", :with => user
    fill_in "password", :with => "123456"
    click_button "Login"

    ApplicationController.class_eval <<-EOE
      def current_user
        @current_user ||= User.find_by_name(#{EOE})
      end
    end
EOE
end

2 つの欠点があります。

  1. このようにビューレベルの問題とコントローラーレベルの問題を混在させるのは本当にハックです。
  2. 「ログアウト」をモックアップするのは難しいでしょう
于 2009-04-08T16:23:42.650 に答える