5

poltergeist と phantomjs を javascript ドライバーとして使用して、リクエスト テストに capybara を使用していくつかのテストを作成しました。

ログイン フォームに入力する次の手順は、js がなくてもうまく機能します。

it "signs in" do
    visit new_user_session_path
    fill_in "Email", with: user
    fill_in "Password", with: password||"foobar"
    click_button "Login"
end

js でテストを定義すると、it "signs in", js: true do次のエラーでテストが失敗します。

Capybara::ElementNotFound: Unable to find field "Email"

ログイン フォーム自体は、simple_form をフォーム ジェネレータとして使用し、フロントエンドでブートストラップを使用して構築されます。フィールドにはラベルがありません。検索テキストはプレースホルダー属性にのみ含まれます。

= simple_form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f|
  = f.input :email, :placeholder => User.human_attribute_name(:email), :label => false, :input_html => {:class => 'input-xlarge'}
  = f.input :password, :placeholder => User.human_attribute_name(:password), :label => false, :input_html => {:class => 'input-xlarge'}
  %div
    = f.button :submit, "Login", :class => 'btn btn-large btn-primary'

このコードは、次の html コードを生成します

<form accept-charset="UTF-8" action="/users/login" class="simple_form new_user" id="new_user" method="post" novalidate="novalidate">
  <div style="margin:0;padding:0;display:inline">
    <input name="utf8" type="hidden" value="✓">
  </div>
  <div class="control-group email required user_email">
    <div class="controls">
      <input class="string email required input-xlarge" id="user_email" name="user[email]" placeholder="Email" size="50" type="email" value="">
    </div>
  </div>
  <div class="control-group password required user_password">
    <div class="controls">
      <input class="password required input-xlarge" id="user_password" name="user[password]" placeholder="Password" size="50" type="password">
    </div>
  </div>
  <div>
    <input class="btn btn btn-large btn-primary" name="commit" type="submit" value="Login">
  </div>
</form>

jsがアクティブ化されていてもフィールドが確実に見つかるようにする方法はありますか?

4

2 に答える 2

1

後でスクリーンショットを撮り、visit new_user_session_path:js => true のときに html がレンダリングされていることを確認します。

visit new_user_session_path
save_and_open_page

何もレンダリングされていない場合は、空の html ドキュメントだけです。spec_helper.rb で確認してください。

config.use_transactional_fixtures = false

また、DatabaseCleaner gem を使用してみてください。

RSpec.configure do |config|
  config.use_transactional_fixtures = false

  config.before(:suite) do
    DatabaseCleaner.clean_with :truncation
  end

  config.before(:each) do
    if example.metadata[:js]
      DatabaseCleaner.strategy = :truncation
    else
      DatabaseCleaner.strategy = :transaction
    end
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end
于 2013-10-26T19:24:17.163 に答える