在控制器规范中清理参数的最佳方法

Best way to sanitize params in controller spec

我使用 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

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

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

private

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

我的问题是:如何正确清理/.to_i我在这个控制器规范中的参数而不重写我在这个规范中的函数?

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

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

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