我在Rails应用程序中使用rspec
和capybara
,并且试图模拟用户从应用程序中注销,但是它无法识别当前用户的名字。上。导航在每个页面的一部分中,我想让测试单击导航栏中的用户名,这会打开一个下拉列表,然后单击注销。
这是具有退出链接的导航部分。
<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
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”
答案 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