在控制器规范中消毒params的最佳方法

时间:2016-08-02 13:52:56

标签: ruby-on-rails rspec factory-bot

我使用RSpec和FactoryGirl(构建我的模型)来测试我的应用程序中的控制器,测试失败:

subject do
  post :create, params: {
    my_model: attributes_for(:my_model,
                             :pictures_for_post_request)
  }, session: { user_id: user.id }
end
it 'return a 200 status response' do
  subject
  expect(response).to have_http_status 200
end

当测试失败时,它返回一个http状态代码400,因为在我的模型验证中,我检查这个模型的属性是否在两个整数值之间,而作为param传递的值是一个字符串。

但是在我的控制器中,我解析了我的参数以获得正确的整数:

private

def sanitize_params
  [my_params_keys].each do |k|
    params[k] = params[k].to_i if params[k].nil?
  end
end

我的问题是:如何在此规范中正确清理/ .to_i我的params而不重写此规范中的函数?

1 个答案:

答案 0 :(得分:0)

我认为最好是模型知道如何处理数据而不是依赖于按照预期方式格式化的数据。这是模型验证的重点。正如您所看到的,根据您的测试,即使您尝试对其进行消毒,参数也可以是任何东西。

class MyModel
  before_validation :convert_my_attribute_to_integer

  private

  def convert_my_attribute_to_integer
    self.my_attribute = self.my_attribute.to_i
  end
end

这样,您的模型可以在多个上下文中使用,而不必担心输入是否格式正确。