我的应用程序将治疗作为任务列表进行管理。任务是通过从治疗显示视图调用的模式窗口创建和编辑的。当关闭任务表单时,我
redirect_back
进行处理,以root_path作为后备位置:
def update
@task.updated_by = current_login
respond_to do |format|
if @task.update_attributes(task_params)
format.html { redirect_back fallback_location: root_path, notice: t('.Success') }
format.json { head :no_content }
else
format.html { redirect_back fallback_location: root_path, notice: "#{t('.Failure')}: #{@task.errors.full_messages.join(',')}" }
format.json { render json: @task.errors, status: :unprocessable_entity }
end
end
end
使用 Rspec 测试它总是会引发错误,因为它重定向到 root_path:
describe "update - PATCH /tasks/:id" do
context "with valid parameters" do
let(:new_attributes) do
{
sort_code: "RSPEC-Updated"
}
end
it "updates the requested task" do
patch task_url(task), params: {
task: new_attributes
}.merge(extra_fields)
expect(response).to redirect_to(treatment_url(task.parent))
end
end
如何配置测试以重定向到预期位置并使其通过?
redirect_back
方法使用request.referer
重定向到之前的位置:
def redirect_back(fallback_location,, **args)
if referer = request.headers["Referer"]
redirect_to referer, **args
else
redirect_to fallback_location, **args
end
end
因此您需要将
referer
设置为所需的 URL(就像您的情况一样,它应该设置为 treatment_url(task.parent)
)。
您可以尝试通过存根或可能像这个答案中提到的
在Rspec中设置
referer
:
request.env['HTTP_REFERER'] = treatment_url(task.parent)