Updating, showing, and deleting users, exercises
有没有办法为用户控制器操作创建Rspec测试,例如“创建”和“新建?”
我不清楚这两个行为“创造”和“新”之间的差异;有人可以这么善意吗?
创建测试后,我将如何实现redirect_to root_path?我想我应该在before_filter signed_in部分中包含“new”和“create”操作,但这不会自动重定向到根目录。
我尝试通过修改users_controller.rb文件来传递测试,如下所示:
def create
if signed_in?
redirect_to root_path
else
@user = User.new(params[:user])
if @user.save
sign_in @user
flash[:success] = "Welcome to the Sample App!"
redirect_to @user
else
render 'new'
end
end
end
答案 0 :(得分:10)
我为此做了一个过滤器,似乎效果很好, 我做了这个测试:
on authentication_pages_spec.rb
describe "signin" do
describe "authorization" do
describe "for signed in users" do
let(:user) { FactoryGirl.create(:user) }
let(:new_user) { FactoryGirl.attributes_for(:user) }
before { sign_in user }
describe "using a 'new' action" do
before { get new_user_path }
specify { response.should redirect_to(root_path) }
end
describe "using a 'create' action" do
before { post users_path new_user }
specify { response.should redirect_to(root_path) }
end
end
end
end
就像@WillJones所说,有些人可能不得不将no_capybara: true
添加到前一块
并在我的用户控制器上:
before_filter :signed_in_user_filter, only: [:new, :create]
def signed_in_user_filter
redirect_to root_path, notice: "Already logged in" if signed_in?
end
对于new和create操作之间的区别,它与REST架构风格有关,但基本上,new
是来自用户控制器的响应GET
的操作请求并且负责返回它响应的视图(在这种情况下,是一个新的用户表单)。另一方面,create
是一个响应POST
请求的动作,它不呈现任何内容(它可以用javascript响应,但这是一个高级主题)并且它是负责创建的人新用户,就像动作的名字所暗示的那样。
答案 1 :(得分:1)
create
)。一个用于页面创建新用户(new
)。答案 2 :(得分:0)
我也做了一个前过滤器,但我的过滤器不同,我不明白为什么它的工作原理。
我的用户控制器有以下条目
class UsersController < ApplicationController
.
.
before_filter :logged_in_user, only: [:new, :create]
.
.
def logged_in_user
redirect_to(root_path) if !current_user?(@user)
end
它在 rkrdo 的示例中运行得很好,并且相应的测试通过。但这是否意味着当用户登录时current_user与用户不同,反之亦然?在我看来,他们在第一种情况下应该是平等的,不应该在第二种情况下。