Friendly_id gem 及其对测试的影响(没有 slug)

Friendly_id gem and its effects on tests (without slug)

我通过添加到用户模型实现了 friendly_id gem:

include FriendlyId
friendly_id :username

在我添加的控制器中,将 User.find(params[:id]) 替换为 User.friendly.find(params[:id]):

  def show
    @user = User.friendly.find(params[:id])           # Line 21
    redirect_to signup_url and return unless (@user.activated)
  end

所以我没有使用 Slug。

问题: 现在突然各种测试都失败了。下面一个例子。我按照建议添加了 .to_param 但这并没有改变错误消息:

class AvatarUploadTest < ActionDispatch::IntegrationTest
  def setup
    @admin             = users(:michael)
  end

  test "avatar upload" do
    log_in_as("user", @admin.to_param)    # Helper method that logs in.
    get user_path(@admin)                 # Line 16
    ...etc

此测试使用以下测试助手:

  def log_in_as(type, user, options = {})
    password    = options[:password]    || 'password'
    remember_me = options[:remember_me] || '1'
    if integration_test?
      post login_path, session: { email:       user.email,
                                  password:    password,
                                  remember_me: remember_me }
    else
      if type == "user"
        session[:user_id] = user.id
      elsif type == "member"
        session[:member_id] = user.id
      end
    end
  end

错误信息:

ERROR["test_avatar_upload", AvatarUploadTest, 2015-04-14 13:46:57 +0000]
 test_avatar_upload#AvatarUploadTest (1429019217.17s)
ActiveRecord::RecordNotFound:         ActiveRecord::RecordNotFound: ActiveRecord::RecordNotFound
            app/controllers/users_controller.rb:21:in `show'
            test/integration/avatar_upload_test.rb:16:in `block in <class:AvatarUploadTest>'
        app/controllers/users_controller.rb:21:in `show'
        test/integration/avatar_upload_test.rb:16:in `block in <class:AvatarUploadTest>'

这与 friendly_id gem 有什么关系?我不是很了解,也不知道我的测试需要做哪些调整。

抱歉,起初我误读了您的问题,没有意识到您已将控制器更改为使用 User.friendly.find - 这很不寻常,因为通常您希望对这些类型的 URL 使用友好 ID。

所以,因为您仍在使用原始 id,所以您需要在测试中提供它,即。你需要输入:

get user_path(@admin.id)

如果您只提供 @admin,那么 Rails 将对其调用 .to_param,这将是友好的 ID,如果您这样做,将会找到它:User.find(params[:id])但既然您已经转换为 User.friendly.find(params[:id])

不会 被发现