[英]Updated checkbox, when there is no data passed. ROR. What is going on?
[英]Test that the 'save' function fails when invalid data is passed. (Ruby Rspec)
我正在開發一個在“項目”model 中具有以下驗證標准的項目:
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
項目控制器:
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 函數。
在現在的測試中,驗證依賴於項目 model,但我想測試保存 function。 如何模擬保存 function 失敗?
您可以使用allow_any_instance_of
,但這有點像錘子。 相反,制作一個雙重模擬 Project.new 來返回它。
context 'Project#save raises ActiveRecord::ActiveRecordError' do
let(:project) {
# Set up the double to fail on save.
instance_double("Project").tap { |project|
allow(project).to receive(:save).and_raise(ActiveRecord::ActiveRecordError)
}
}
before {
# Set up Project.new to return the double
allow(Project).to receive(:new).and_return(project)
}
end
請注意,如果它執行了非常不尋常的錯誤,那么save
引發 ActiveRecord::ActiveRecordError 是非常不尋常的。 您通常不會在 controller 中拯救它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.