退出链接是假的?

时间:2014-07-16 07:27:19

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

朋友我在Michael Hartl Ruby教程9.1.3(成功编辑)。 在我完成指导后运行

bundle exec rspec spec / 

发生以下错误..

 1) User pages edit with valid information 
 Failure/Error: it { should have_link('Sign out',    href: signout_path) }
   expected #has_link?("Sign out", {:href=>"/signout"}) to return true, got false
 # ./spec/requests/user_pages_spec.rb:82:in `block (4 levels) in <top (required)>'

在2.71秒内完成 63个例子,1个失败,3个未决

失败的例子:

rspec ./spec/requests/user_pages_spec.rb:82#用有效信息编辑用户页面

我无法找到错误我也将代码上传到错误发生的地方。 User_pages_spec.rb

User_pages_spec.rb (完整)

  require 'spec_helper'

describe "User pages" do

  subject { page }

  describe "signup page" do
    before { visit signup_path }

    it { should have_content('Sign up') }
    it { should have_title(full_title('Sign up')) }
  end

  describe "signup" do

    before { visit signup_path }

    let(:submit) { "Create my account" }

    describe "with invalid information" do
      it "should not create a user" do
        expect { click_button submit }.not_to change(User, :count)
      end
    end



    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

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

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


      end
      it "should create a user" do
        expect { click_button submit }.to change(User, :count).by(1)
   end
   end
  end
describe "profile page" do
    let(:user) { FactoryGirl.create(:user) }
    before { visit user_path(user) }

    it { should have_content(user.name) }
    it { should have_title(user.name) }
  end

  describe "edit" do
    let(:user) { FactoryGirl.create(:user) }
    before { sign_in user }
    before { visit edit_user_path(user) }

    describe "with valid information" do
      let(:new_name)  { "New Name" }
      let(:new_email) { "new@example.com" }
      before do
        fill_in "Name",             with: new_name
        fill_in "Email",            with: new_email
        fill_in "Password",         with: user.password
        fill_in "Confirm Password", with: user.password
        click_button "Save changes"
      end

      it { should have_title(new_name) }
      it { should have_selector('div.alert.alert-success') }
      it { should have_link('Sign out', href: signout_path) }
      specify { expect(user.reload.name).to  eq new_name }
      specify { expect(user.reload.email).to eq new_email }
    end

    describe "page" do
      it { should have_content("Update your profile") }
      it { should have_title("Edit user") }
      it { should have_link('change', href: 'http://gravatar.com/emails') }
    end

    describe "with invalid information" do
      before { click_button "Save changes" }

      it { should have_content('error') }
    end 
  end
  end

end

2 个答案:

答案 0 :(得分:1)

伙计们我解决了上面讨论的错误。 我提供了我新的更新代码,因为在搜索过程中我发现很多朋友都有同样的问题。所以请将您的代码与我的新代码进行比较,希望您的错误也被删除。

user_pages_spec.rb

 require 'spec_helper'

    describe "User pages" do

      subject { page }

      describe "signup page" do
        before { visit signup_path }

        it { should have_content('Sign up') }
        it { should have_title(full_title('Sign up')) }
      end

      describe "signup" do

        before { visit signup_path }

        let(:submit) { "Create my account" }

        describe "with invalid information" do
          it "should not create a user" do
            expect { click_button submit }.not_to change(User, :count)
          end
        end



        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

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

            it { should have_link('Sign out') }
            it { should have_title(user.name) }
            it { should have_selector('div.alert.alert-success', text: 'Welcome') }
          end
          it "should create a user" do
            expect { click_button submit }.to change(User, :count).by(1)
       end
       end
      end
    describe "profile page" do
        let(:user) { FactoryGirl.create(:user) }
        before { visit user_path(user) }

        it { should have_content(user.name) }
        it { should have_title(user.name) }
      end

      describe "edit" do
        let(:user) { FactoryGirl.create(:user) }
        before do
          sign_in user
          visit edit_user_path(user)
        end

        describe "with valid information" do
          let(:new_name)  { "New Name" }
          let(:new_email) { "new@example.com" }
          before do
            fill_in "Name",             with: new_name
            fill_in "Email",            with: new_email
            fill_in "Password",         with: user.password
            fill_in "Confirm Password", with: user.password
            click_button "Save changes"
          end

          it { should have_title(new_name) }
          it { should have_selector('div.alert.alert-success') }
          it { should have_link('Sign out', href: signout_path) }
          specify { expect(user.reload.name).to  eq new_name }
          specify { expect(user.reload.email).to eq new_email }
        end


        describe "page" do
          it { should have_content("Update your profile") }
          it { should have_title("Edit user") }
          it { should have_link('change', href: 'http://gravatar.com/emails') }
        end

         describe "with invalid information" do
          before { click_button "Save changes" }

          it { should have_content('error') }
        end
      end

    end

user_controller.rb

class UsersController < ApplicationController

  def show
    @user = User.find(params[:id])
  end

  def create 
    @user = User.new(user_params)
    if @user.save
      sign_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end

  def edit
    @user = User.find(params[:id])
  end

   def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      flash[:success] = "Profile updated"
      redirect_to @user
    else
      render 'edit'
    end
  end

  def new
    @user = User.new
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end

_header.html.erb

<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="navbar-inner">
    <div class="container">
      <%= link_to
<header class="navbar navbar-fixed-top navbar-inverse">
  <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", edit_user_path(current_user) %></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>
 "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", edit_user_path(current_user) %></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>
希望这有帮助! 如果您需要更多细节,请问我。

由于 贾齐卜·巴希尔

答案 1 :(得分:0)

您可能会发现此答案很有帮助 https://stackoverflow.com/a/18806971/2545197

你的&#34;编辑&#34;在user_pages_spec.rb中有这个部分&#34; 描述&#34;有效信息&#34;做&#34; ?

describe "edit" do
    let(:user) { FactoryGirl.create(:user) }
    before do
      sign_in user          # <-this line is needed for spec to look for sign_out
      visit edit_user_path(user)
    end

此外,如果您错过了,请在第9.9节中的代码后面右侧检查此行。

&#34;请注意,代码清单9.9将清单9.6中的 sign_in 方法添加到before块, 注销 strong>“链接测试通过,并期望保护编辑操作免受非登录用户的影响(第9.2.1节)。&#34;

所以,根据这个,你应该在 spec / requests / user_pages_spec.rb 中有一段代码。 像这样:

def sign_in(user, options={})
  if options[:no_capybara]
    # Sign in when not using Capybara.
    remember_token = User.new_remember_token
    cookies[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.digest(remember_token))
  else
    visit signin_path
    fill_in "Email",    with: user.email
    fill_in "Password", with: user.password
    click_button "Sign in"
  end
end

如果没有,那么请添加它。让我知道它是否有帮助?