在 Rails 4 中使用 minitest 测试强参数
Test strong parameters with minitest in Rails 4
我是 Rails 的新手,我想通过控制器测试来测试我为 Book 模型设置的强大参数。我正在使用 Minitest 和 Rails 4.
图书型号:
class Book < ActiveRecord::Base
validates :title, presence: true, length: { in: 1..150 }
end
带参数的图书控制器:
def create
@book = Book.new book_params
if @book.save
redirect_to action: "index", notice: 'Success.'
else
render :new
end
end
private
def book_params
params.require(:book).permit(:title, :cover_image)
end
我的测试想法 - 确实失败了,因为它创建了一个条目:
assert_no_difference('Book.count') do
post :create, book: {
id: 123,
title: "Lorem ipsum"
}
end
我怎样才能让测试顺利进行,用控制器测试强参数是否正确?
由于Rails 删除所有不在permit
中的不允许的参数,将创建新记录,因此测试将是红色的。
不过,当提交非白名单参数时,可以使用 action_on_unpermitted_parameters
方法引发异常。
我正在寻找几乎相同问题的答案。当使用 Rails 5 时,我最终想出了一个解决方案(如果你愿意,可以称之为解决方法 :-) 来测试不需要的参数实际上没有通过。在我(此处简化)的情况下,我想禁止在创建新用户时传递一些 "security critical" 参数。
在控制器中(只允许 email
和 password
):
private
def user_params
params.require(:user).permit(:email, :password)
end
在集成测试中:
test "not permitted signup data submitted" do
new_user_email = "tester_" + (0...10).map { ('0'..'9').to_a[rand(26)] }.join + "@testing.net"
get signup_path
assert_difference 'User.count', 1 do
post signup_path, params: { user: { email: new_user_email, password: "testpassword", role_id: 1 } }
end
user = User.last
assert user.email == new_user_email
assert user.role_id == nil
end
在这里,我提交了一个附加的 "sensitive" 参数 role_id
,其值为 1
(管理员)。我希望创建用户。然后我读到那个新(最后)创建的用户并期望它有 role_id
空(nil
)。为了使测试失败,我将 :role_id
添加到 user_params
。删除它,使测试通过。显然,如果您的属性不能为 nil(在 SQL 中也称为 NULL),您可以测试存储的默认值而不是提交的值。
我是 Rails 的新手,我想通过控制器测试来测试我为 Book 模型设置的强大参数。我正在使用 Minitest 和 Rails 4.
图书型号:
class Book < ActiveRecord::Base
validates :title, presence: true, length: { in: 1..150 }
end
带参数的图书控制器:
def create
@book = Book.new book_params
if @book.save
redirect_to action: "index", notice: 'Success.'
else
render :new
end
end
private
def book_params
params.require(:book).permit(:title, :cover_image)
end
我的测试想法 - 确实失败了,因为它创建了一个条目:
assert_no_difference('Book.count') do
post :create, book: {
id: 123,
title: "Lorem ipsum"
}
end
我怎样才能让测试顺利进行,用控制器测试强参数是否正确?
由于Rails 删除所有不在permit
中的不允许的参数,将创建新记录,因此测试将是红色的。
不过,当提交非白名单参数时,可以使用 action_on_unpermitted_parameters
方法引发异常。
我正在寻找几乎相同问题的答案。当使用 Rails 5 时,我最终想出了一个解决方案(如果你愿意,可以称之为解决方法 :-) 来测试不需要的参数实际上没有通过。在我(此处简化)的情况下,我想禁止在创建新用户时传递一些 "security critical" 参数。
在控制器中(只允许 email
和 password
):
private
def user_params
params.require(:user).permit(:email, :password)
end
在集成测试中:
test "not permitted signup data submitted" do
new_user_email = "tester_" + (0...10).map { ('0'..'9').to_a[rand(26)] }.join + "@testing.net"
get signup_path
assert_difference 'User.count', 1 do
post signup_path, params: { user: { email: new_user_email, password: "testpassword", role_id: 1 } }
end
user = User.last
assert user.email == new_user_email
assert user.role_id == nil
end
在这里,我提交了一个附加的 "sensitive" 参数 role_id
,其值为 1
(管理员)。我希望创建用户。然后我读到那个新(最后)创建的用户并期望它有 role_id
空(nil
)。为了使测试失败,我将 :role_id
添加到 user_params
。删除它,使测试通过。显然,如果您的属性不能为 nil(在 SQL 中也称为 NULL),您可以测试存储的默认值而不是提交的值。