【发布时间】:2021-02-26 18:42:10
【问题描述】:
我正在开发一个在“项目”模型中具有以下验证标准的项目:
validates :project_name,
presence: true,
format: { with: /\A[a-zA-Z\s_-]+\z/,
message: 'allows letters, spaces, underscores, and hyphens' }
validates :jira_id,
uniqueness: true,
presence: true,
format: { with: /\A[A-Z]+-[0-9]+\z/,
message: 'allows capitalized letters followed by a hyphen and numbers' }
validates :capacity,
presence: true,
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
validates :openings,
presence: true,
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
validates_format_of :last_status_change_dt,
with: /\d{4}-\d{2}-\d{2}/,
message: 'must be formatted as YYYY-MM-DD',
on: :save
validates_presence_of :last_status_change_dt
projects_controller:
def create
ActiveRecord::Base.transaction do
parameters = project_params.dup
parameters[:language_id] = get_language_id(params[:language_name]) if parameters[:language_id].nil?
@project = Project.new(parameters)
if @project.save
render json: @project, status: :created, location: @project
else
render json: @project.errors, status: :not_acceptable
raise ActiveRecord::Rollback
end
end
rescue ActiveRecord::ActiveRecordError
render json: { text: 'Project was not created' }, status: :internal_server_error
end
在 spec 文件中,使用了 FactoryBot build 和 create 函数。
在目前的测试中,验证依赖于项目模型,但我想测试保存功能。如何模拟保存功能失败?
【问题讨论】:
-
IMO 最好不要模拟保存功能......相反,只需在您的测试数据中引入验证错误(例如,给它一段无效数据)然后
save将失败为结果 -
ActiveRecord::ActiveRecordError是一个非常通用且不寻常的错误。与其在单个控制器中拯救它,不如在更高级别拯救它并发出更一般的错误可能更有意义。此外,如果 save 返回 false,您不必回滚。
标签: ruby-on-rails ruby rspec