在 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" 参数。

在控制器中(只允许 emailpassword):

    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),您可以测试存储的默认值而不是提交的值。