如何在RSpec 3.12请求中测试redirect_back?

问题描述 投票:0回答:1

我的应用程序将治疗作为任务列表进行管理。任务是通过从治疗显示视图调用的模式窗口创建和编辑的。当关闭任务表单时,我

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

如何配置测试以重定向到预期位置并使其通过?

ruby-on-rails rspec
1个回答
0
投票

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)
© www.soinside.com 2019 - 2024. All rights reserved.