7

更新、显示和删除用户、练习

有没有办法为“创建”和“新建”等用户控制器操作创建 Rspec 测试?

我也不太清楚“创建”和“新建”这两个动作之间的区别。有人可以详细说明吗?

创建测试后,我将如何实现redirect_to root_path?我想我应该在 before_filter signed_in 部分中包含“新建”和“创建”操作,但这不会自动重定向到根目录。

我试图通过修改 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
4

3 回答 3

10

我为此做了一个之前的过滤器,似乎效果很好,对于我这样做的测试:

在 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 块

在我的用户控制器上:

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 响应,但这是一个高级主题)并且它负责创建新用户,就像操作的名称所暗示的那样。

于 2012-07-02T04:29:41.810 回答
1
  1. 是的; 这部分开始于7.16和其他地方。
  2. 一个实际上创建了一个用户 ( create)。一个是用于创建新用户的页面( ) new
  3. 不确定我是否理解这个问题。
于 2012-06-20T11:55:44.557 回答
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 与用户登录时的用户不同,反之亦然?在我看来,它们在第一种情况下应该相等,而在第二种情况下不应该。

于 2013-02-20T08:49:03.070 回答