3

フォームをテストするために Capybara をセットアップしようとしていますが、エラーが発生し続けます
cannot fill in, no text field, text area or password field with id, name, or label 'Name' found

これが私の見解です:

<%= form_for(@user) do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
  ...
  <%= f.submit "Create Account", class: "btn btn-large btn-primary" %>
<% end %>

次の html をレンダリングします。

<label for="user_name">Name</label>
<input id="user_name" name="user[name]" size="30" type="text" />

したがって、ラベルに基づいてフィールドを見つける必要があるようです。

これが私の user_pages_test.rb ファイルの内容です (私は Test::Unit と shoulda-context を使用しています):

context "sign up page" do
  should "add user to database when fields are filled in" do
    fill_in "Name", with: "Bubbles"
    ...
    click_button "Create Account"
  end
end

これが私がこれまでに試したことです:

1) への呼び出しをfill_inid に一致するfill_in "user_name", with: "Bubbles"
ように変更する 2)ドキュメントの例に一致するようにfill_inへの呼び出しを変更する 3) ビューを変更して、手動で IDを 追加する(この回答) 4) への呼び出しを変更する(場合に備えて)ルーティングの問題でした) page.fill_in "Name", with: "Bubbles"
"Name"<%= f.text_field :name, id: "Name" %>
get sign_up_pathget "/sign_up"

これらすべてでまだ同じエラーが発生するため、何らかの理由でページが正しく読み込まれていないと思われます。ただし、ページのタイトルが正しいことをアサートする同じコンテキストで別の (合格した) テストがあるため、ページが正しく読み込まれることがわかります (でsetup)。

これに基づいて(およびこのfill_in回答によると)、フィールドにアクセスしようとする前にメソッドがページのロードを待っていないことが問題のようです。この提案に従って、テストに行を追加してputs page.body、フィールドに入力しようとする前に HTML が完全にロードされていることを確認し、次の出力を得ました。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">

fill_inだから、ページが読み込まれるのを待っていなかったと確信していました. 私はそれから試しました

5)この回答Capybara.default_wait_timeに従って変更しましたが、これは効果がありませんでした。test_helperファイル(Capybaraが含まれている場所) のクラスと、テスト自体に設定してみました。ActionDispatch::IntegrationTest

puts page.body次に、合格テスト (正しいタイトルをアサートする前後の両方) を追加してみましたが、同じ出力が得られました。THEN、私はこの答えを見つけ、最終的にコンソールにページの HTML を出力させました。カピバラにフィールドを入力させるために、もう 1 つ試してみました。

6) 呼び出しをfill_insay@response.fill_inに変更しました。これは、変数が本来 @response行うべきだと思っていたことを実行しているように見えるためです。page

だから、私はこれについて2つの質問があります:

1)page変数は実際に何を参照していますか? 私のアプリの doctype 宣言は だけ<!DOCTYPE html>なので、古いものをどこから取得するのかわかりません。

2) Capybara がこれらのフィールドを検索/入力できないのはなぜですか?

4

1 に答える 1

1

visitページオブジェクトを正しく設定するには、このメソッドを使用する必要があります。カピバラのドキュメントには、デフォルトで「/」にアクセスすることが示されています。他のページにアクセスする場合は、明示的に呼び出す必要があります。の違いvisitgetについて少し読むことも役立つかもしれません。

于 2012-12-09T10:19:51.500 に答える