0

我使用 M. Hartl Rails 教程来创建我的应用程序。所以我有一个User模型,所有的current_usersigned_in_user方法。

我想让以下测试通过:

describe "submitting a PATCH request to the Users#update action" do
  before do
    be_signed_in_as FactoryGirl.create(:user)
    patch user_path(FactoryGirl.create(:user))
  end
  specify { expect(response).to redirect_to(root_path) }
end

但测试失败:

 Failure/Error: specify { expect(response).to redirect_to(root_path) }
   Expected response to be a redirect to <http://www.example.com/> but was a redirect to <http://www.example.com/signin>.
   Expected "http://www.example.com/" to be === "http://www.example.com/signin".

所以这是用户控制器的一部分

class UsersController < ApplicationController

  before_action :signed_in_user, only: [:index, :edit, :update, :destroy]
  before_action :correct_user,   only: [:edit, :update]
  before_action :admin_user, only: :destroy

      .
      .
      .
      .
  private

    def signed_in_user
      unless !current_user.nil?
        store_url
        redirect_to signin_url, notice: t('sign.in.please')
      end
    end

    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_path) unless current_user?(@user)
    end

    def admin_user
      redirect_to(root_path) unless current_user.admin?
    end
end

如果我删除before_create :signed_in_user...线,测试通过。但这是为什么呢?be_signed_in_as规范方法在所有其他测试(~ 1k)中都有效,所以原因必须在事情specify { expect(response)之内。

4

2 回答 2

0

每次调用 时FactoryGirl.create(:user),您都在创建一个额外的用户。您列出的代码是在数据库中创建两个单独的用户记录。因此,除非您打算为此测试创建两个不同的用户,否则您可能应该在before块之前有一行,例如:

let(:user) { FactoryGirl.create(:user) }

然后只需参考user您想要一个用户记录的任何地方。

于 2013-09-30T19:06:52.787 回答
0

您的测试将user_path针对与您登录的用户不同的用户,因此您将被correct_user过滤器重定向到根目录。您需要保存您登录的用户并将其用于您的user_path.

于 2013-09-30T14:50:40.070 回答