我是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
如何让测试变为绿色,用控制器测试测试强参数是否正确?
答案 0 :(得分:1)
由于Rails 丢弃所有未允许的参数而不是permit
,因此将创建新记录,因此测试将为红色。
虽然,在提交非列入清单的参数时,可以使用action_on_unpermitted_parameters
方法引发异常。
答案 1 :(得分:1)
我正在寻找几乎相同问题的答案。当使用Rails 5时,我最终想出了一个解决方案(如果你愿意,请调用它解决方法:-)用于测试不需要的参数实际上是否通过。在我(简称这里)的情况下,我想禁止一些&#34;安全关键&#34;在创建新用户时传递参数。
在控制器中(仅允许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
在这里,我提交了一份额外的&#34;敏感&#34;参数role_id
,其值为1
(admin)。我希望创建用户。然后我读了新(最后)创建的用户并希望它role_id
为空(nil
)。要使测试失败,我将:role_id
添加到user_params
。删除它,使测试通过。显然,如果你的属性不能为零(在SQL中也称为NULL),你可以测试存储的默认值而不是提交的默认值。