在Rails 4中使用minitest测试强参数

时间:2016-03-08 14:51:49

标签: ruby-on-rails ruby-on-rails-4 minitest

我是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

如何让测试变为绿色,用控制器测试测试强参数是否正确?

2 个答案:

答案 0 :(得分:1)

由于Rails 丢弃所有未允许的参数而不是permit,因此将创建新记录,因此测试将为红色。

虽然,在提交非列入清单的参数时,可以使用action_on_unpermitted_parameters方法引发异常。

答案 1 :(得分:1)

我正在寻找几乎相同问题的答案。当使用Rails 5时,我最终想出了一个解决方案(如果你愿意,请调用它解决方法:-)用于测试不需要的参数实际上是否通过。在我(简称这里)的情况下,我想禁止一些&#34;安全关键&#34;在创建新用户时传递参数。

在控制器中(仅允许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

在这里,我提交了一份额外的&#34;敏感&#34;参数role_id,其值为1(admin)。我希望创建用户。然后我读了新(最后)创建的用户并希望它role_id为空(nil)。要使测试失败,我将:role_id添加到user_params。删除它,使测试通过。显然,如果你的属性不能为零(在SQL中也称为NULL),你可以测试存储的默认值而不是提交的默认值。