Rspec测试登出

时间:2018-07-24 18:12:32

标签: ruby-on-rails rspec ruby-on-rails-5 capybara rspec-rails

我在Rails应用程序中使用rspeccapybara,并且试图模拟用户从应用程序中注销,但是它无法识别当前用户的名字。上。导航在每个页面的一部分中,我想让测试单击导航栏中的用户名,这会打开一个下拉列表,然后单击注销。

这是具有退出链接的导航部分。

<li class="nav-item dropdown">
  <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
    <i class='glyphicon glyphicon-user'></i> <%= current_user.first_name.capitalize %> <span class="caret"></span>
  </a>
  <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown" id: "signedin" >
    <%= link_to raw("<i class='fa fa-user' aria-hidden='true'></i> Profile"), current_user, class: "dropdown-item" %>
    <%= link_to raw("<i class='fa fa-cog' aria-hidden='true'></i> Settings"), current_user, class: "dropdown-item" %>
    <%= link_to raw("<i class='fa fa-question-circle' aria-hidden='true'></i> Help"), current_user, class: "dropdown-item" %>
    <div class="dropdown-divider"></div>
    <%= link_to raw("<i class='fa fa-bug' aria-hidden='true'></i> Report Bug"), new_bug_path, class: "dropdown-item" %>
    <%= link_to raw("<i class='fa fa-gift' aria-hidden='true'></i> Request Feature"), current_user, class: "dropdown-item" %>
    <div class="dropdown-divider"></div>
      <%= link_to raw("<i class='fa fa-sign-out' aria-hidden='true'></i> Sign Out"), session_path, method: :delete, class: "dropdown-item", id: "signout-user" %>
  </div>
</li>

这是我正在运行的测试:

require 'rails_helper'

describe "A user" do

  def setup
    @user = User.create!(user_attributes(email: "test@testing.com"))
    logout(@user)
  end

  before(:each) do
    setup
  end

  it "should be redirected going to following path when not logged in" do
    visit following_user_path(@user)
    expect(current_path).to eq(root_url)    
  end

  it "should be redirected when go to followers path when not logged in" do
    visit followers_user_path(@user)
    expect(current_path).to eq(root_url)    
  end   

end

这是我上班时遇到的辅助功能。我的应用程序有一个导航栏,其中显示了当前登录的用户的名字,如果您单击该链接,则会有一个带有选项的下拉菜单,其中一个选项是退出:

def logout(a)
  visit root_path
  click_link "#{@user.first_name}"
  click_link 'Sign Out'
end

enter image description here

def create
  @user = User.new(user_params)   
  if @user.save
    session[:user_id] = @user.id # creates session to login user
    flash[:success] = "Hi #{@user.first_name.capitalize}, thanks for creating an account!"
    redirect_to user_url(@user.id)
  else
    render 'new'
  end
end

我得到的错误是

  

失败/错误:click_link“ #{@user.first_name}”
  水豚:: ElementNotFound:      找不到链接“ Mike”

1 个答案:

答案 0 :(得分:0)

在测试中,您创建一个用户,无需登录即访问主页,然后要注销。如果用户未登录,怎么办?另外,您的方法logout令人困惑,因为您在其中访问根URL并注销。此方法应该只做一件事而不是两件事。我要做的是删除logout方法,首先创建一个用户,登录,然后在实际测试中检查是否有适当的链接使用户退出。总而言之,由于用户未登录,因此会出现错误"Element not found"。您的测试实际上并未测试注销功能,而是测试访问某些页面是否会导致某些行为,这是完全不同的情况。我会这样做。

require 'rails_helper'

describe "Logout" do
  let(:user) { create(:user) }

  before(:each) do
    sign_in(:user)
  end

  it "should display a proper flash message when the user logs out" do
    click_link "Logout"
    expect(page).to have_content("You have been logged out")
  end
end