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])
,不会 被发现
我通过添加到用户模型实现了 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])