Ruby on rails rspec+;水豚+;rails Capybara::ElementNotFound无法找到链接
我试图用rspec+capybara测试我编辑和删除帖子的链接是否正确。它们只能由管理员用户查看。我在控件中有一个回调,在部分中有一个条件回调,其中包含链接。这就是我在运行rspec spec/时得到的错误(我用一个简单的版本编写):Ruby on rails rspec+;水豚+;rails Capybara::ElementNotFound无法找到链接,ruby-on-rails,rspec,capybara,Ruby On Rails,Rspec,Capybara,我试图用rspec+capybara测试我编辑和删除帖子的链接是否正确。它们只能由管理员用户查看。我在控件中有一个回调,在部分中有一个条件回调,其中包含链接。这就是我在运行rspec spec/时得到的错误(我用一个简单的版本编写): Capybara::ElementNotFound Unable to find link "edit" Capybara::ElementNotFound Unable to find link "delete" 我认为问题在于,Capybara+rspec
Capybara::ElementNotFound Unable to find link "edit"
Capybara::ElementNotFound Unable to find link "delete"
我认为问题在于,Capybara+rspecs看不到我的部分/集合-在save_和open_页面中,它们不会出现。我要怎么做才能让它们出现在RSPEC中?或者你认为真正的问题是什么
这就是我所拥有的:
/规格/请求/发布页面/specs.rb
require 'spec_helper'
describe "PostPages" do
subject { page }
describe "post destruction" do
let(:user) { FactoryGirl.create(:user) }
before { FactoryGirl.create(:post, user: user) }
describe "as an admin user" do
let(:admin) { FactoryGirl.create(:admin) }
before {sign_in admin}
describe "user is admin" do
subject { admin }
it { should be_admin }
end
describe "from home" do
before { visit root_path }
it "should delete a post" do
save_and_open_page
expect { click_link "delete", match: :first}.to change(Post, :count).by(-1)
end
end
end
end
describe "post editing" do
let(:user) { FactoryGirl.create(:user) }
before { FactoryGirl.create(:post, user: user) }
describe "as an admin user" do
let(:admin) { FactoryGirl.create(:admin) }
let(:post) { FactoryGirl.create(:post) }
before do
sign_in admin
visit edit_post_path(post)
end
describe "from home" do
before { visit root_path }
it "should edit a post" do
save_and_open_page
expect { click_link "edit", match: :first}.not_to change(Post, :count)
end
end
end
end
end
/app/views/static_pages/home.html.erb
<li>
<span class="posttitle"><%= feed_item.title %></span>
<span class="content"><%= feed_item.content %></span>
<span class="timestamp">
Posted <%= time_ago_in_words(feed_item.created_at) %> ago by <%= feed_item.user.name %>.
</span>
<% if admin?(current_user) %>
<%= link_to "edit", edit_post_path(feed_item),
data: { confirm: "You sure?" },
title: feed_item.content %>
<%= link_to "delete", post_path(feed_item), method: :delete,
data: { confirm: "You sure?" },
title: feed_item.content %>
<% end %>
</li>
/app/controllers/posts_controller.rb
class PostsController < ApplicationController
before_action :signed_in_user, only: [:create, :destroy,:edit, :update]
before_action :admin_user, only: [:destroy,:edit, :update]
def index
@posts = Post.paginate(page: params[:page])
end
def create
@post = current_user.posts.build(post_params)
if @post.save
flash[:success] = "Post created!"
redirect_to root_url
else
@feed_items = []
render 'static_pages/home'
end
end
def destroy
Post.find(params[:id]).destroy
redirect_to root_url
end
def edit
@post = Post.find(params[:id])
end
def update
@post = Post.find(params[:id])
if @post.update(post_params)
flash[:success] = "Post updated"
redirect_to root_url
else
render 'edit'
end
end
private
def post_params
params.require(:post).permit(:title,:content)
end
def correct_user
@post = current_user.posts.find_by(id: params[:id])
redirect_to root_url if @post.nil?
end
end
当前用户可能不是管理员?它在rspec之外工作,启动rails服务器-普通用户无法看到链接,管理员用户可以看到并使用它们(编辑或删除)-。它似乎不适用于rspec+capybara。它不是直接在失败消息上方输出
true
或(可能)false
?基本上是p
输出参数。请检查。它应该打印来自admin?(admin)
的返回值,您依赖该值为真,以呈现视图中缺少的部分。如果它没有输出任何东西,它可能是空的。。。试着用p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
环绕你的p
行,p
就像放置
一样,只是它在打印前调用检查
(在调试时提供更好的信息)。我们试图用p admin.admin?
来确定您的规范是否真的认为用户是管理员。这可能只是因为您的工厂没有将用户设置为适当的管理员。您还可以将用户工厂添加到问题中吗?
<li>
<span class="posttitle"><%= feed_item.title %></span>
<span class="content"><%= feed_item.content %></span>
<span class="timestamp">
Posted <%= time_ago_in_words(feed_item.created_at) %> ago by <%= feed_item.user.name %>.
</span>
<% if admin?(current_user) %>
<%= link_to "edit", edit_post_path(feed_item),
data: { confirm: "You sure?" },
title: feed_item.content %>
<%= link_to "delete", post_path(feed_item), method: :delete,
data: { confirm: "You sure?" },
title: feed_item.content %>
<% end %>
</li>
module SessionsHelper
def sign_in(user)
remember_token = User.new_remember_token
cookies.permanent[:remember_token] = remember_token
user.update_attribute(:remember_token, User.digest(remember_token))
self.current_user = user
end
def signed_in?
!current_user.nil?
end
def current_user=(user)
@current_user = user
end
def current_user
remember_token = User.digest(cookies[:remember_token])
@current_user ||= User.find_by(remember_token: remember_token)
end
def current_user?(user)
user == current_user
end
def signed_in_user
#redirect_to signin_url, notice: "Please sign in." unless signed_in?
unless signed_in?
store_location
redirect_to signin_url, notice: "Please sign in."
end
end
def sign_out
current_user.update_attribute(:remember_token,
User.digest(User.new_remember_token))
cookies.delete(:remember_token)
self.current_user = nil
end
def redirect_back_or(default)
redirect_to(session[:return_to] || default)
session.delete(:return_to)
end
def store_location
session[:return_to] = request.url if request.get?
end
def admin_user
if current_user.admin?
true
else
redirect_to(root_url)
end
end
end
class PostsController < ApplicationController
before_action :signed_in_user, only: [:create, :destroy,:edit, :update]
before_action :admin_user, only: [:destroy,:edit, :update]
def index
@posts = Post.paginate(page: params[:page])
end
def create
@post = current_user.posts.build(post_params)
if @post.save
flash[:success] = "Post created!"
redirect_to root_url
else
@feed_items = []
render 'static_pages/home'
end
end
def destroy
Post.find(params[:id]).destroy
redirect_to root_url
end
def edit
@post = Post.find(params[:id])
end
def update
@post = Post.find(params[:id])
if @post.update(post_params)
flash[:success] = "Post updated"
redirect_to root_url
else
render 'edit'
end
end
private
def post_params
params.require(:post).permit(:title,:content)
end
def correct_user
@post = current_user.posts.find_by(id: params[:id])
redirect_to root_url if @post.nil?
end
end
FactoryGirl.define do
factory :user do
sequence(:name) { |n| "Person #{n}" }
sequence(:email) { |n| "person_#{n}@example.com"}
password "foobar"
password_confirmation "foobar"
factory :admin do
admin true
end
factory :coadmin do
coadmin true
end
end
factory :post do
title "Prueba"
content "Lorem ipsum"
user
end
end