4

_header.html.erb

<header class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container">
      <%= link_to "sample app", root_path, id: "logo" %>
      <nav>
        <ul class="nav pull-right">
          <li><%= link_to "Home", root_path %></li>
          <li><%= link_to "Help", help_path %></li>
          <% if signed_in? %>
            <li><%= link_to "Users", '#' %></li>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                Account <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
                <li><%= link_to "Profile", current_user %></li>
                <li><%= link_to "Settings", '#' %></li>
                <li class="divider"></li>
                <li>
                  <%= link_to "Sign out", signout_path, method: "delete" %>
                </li>
              </ul>
            </li>
          <% else %>
            <li><%= link_to "Sign in", signin_path %></li>
          <% end %>
        </ul>
      </nav>
    </div>
  </div>
</header>

user_pages_spec.rb

    describe "with valid information" do
        before do
            fill_in "Name",         with: "Example User"
            fill_in "Email",        with: "user@example.com"
            fill_in "Password",     with: "foobar"
            fill_in "Confirmation", with: "foobar"
        end

        it "should create a user" do
            expect { click_button submit }.to change(User, :count).by(1)
        end

        describe "after saving the user" do
            before { click_button submit }
            let(:user) { User.find_by_email('user@example.com') }

            it { should have_selector('title', text: user.name) }
            it { should have_selector('div.alert.alert-success', text: 'Welcome') }
            it { should have_link('Sign out') }
        end

        describe "followed by signout" do
            before { click_link "Sign out" }
            it { should have_link('Sign in') }
        end
    end

失敗は次のとおりです。

1) User pages signup with valid information followed by signout
Failure/Error: before ( click_link "Sign out" )
Capybara::ElementNotFound:
no link with title, id, or text 'Sign out' found
(eval):2:in 'click_link'
./spec/requests/user_pages_spec.rb:63:in 'block (5 levels) in (top (required))'

ユーザーの作成プロセスを手動で実行すると、機能しているように見えます。リンクがドロップダウンメニューにある場合は、リンクが関係している可能性がありますか?これは、MHartl railsチュートリアルの中で、すべてのテストに合格する必要があると彼が言っている時点です。

4

3 に答える 3

12

疑わしいコードは、前の説明の内側にネストする必要があるようです

        describe "after saving the user" do
            before { click_button submit }
            let(:user) { User.find_by_email('user@example.com') }

            it { should have_selector('title', text: user.name) }
            it { should have_selector('div.alert.alert-success', text: 'Welcome') }
            it { should have_link('Sign out') }

            describe "followed by signout" do
                before { click_link "Sign out" }
                it { should have_link('Sign in') }
            end
        end
于 2012-07-31T05:56:04.077 に答える
3

最後の説明のbeforeブロックはまだユーザーを作成していません。これが、ユーザー(まだ存在していない)が現在サインインしていないため、「サインアウト」リンクがない理由です。

考えられる解決策の1つclick_button 'submit'は、beforeブロックを使用することです。もう1つはbefore、その時点でサインインしているユーザーがいないため、ブロック内のサインアウトを完全にスキップすることです。

于 2012-07-31T04:22:25.390 に答える
0

はい、前の記述内にネストする必要があります。これが Rails 4 バージョンのチュートリアルでも機能することを確認できます。

于 2013-06-10T09:40:26.437 に答える