在控制器规范中清理参数的最佳方法
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
这样您的模型就可以在多种上下文中使用,而无需担心输入的格式是否正确。
我使用 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
这样您的模型就可以在多种上下文中使用,而无需担心输入的格式是否正确。