MiniTest 控制器更新 - 预期响应为 <3XX:redirect>,但为 <200:OK> [英] MiniTest Controller Updates - Expected response to be a <3XX: redirect>, but was a <200: OK>

查看:42
本文介绍了MiniTest 控制器更新 - 预期响应为 <3XX:redirect>,但为 <200:OK>的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些控制器测试一直失败,但我不知道为什么.控制器 update 动作:

I have some controller tests that keep failing but I don't know why. The controller update action:

  def update
    respond_to do |format|
      if @tag_category.update(tag_category_params)
        format.html { redirect_to company_tags_url, notice: 'Tag category was successfully updated.' }
      else
        format.html { render :edit }
      end
    end
  end

和相应的测试:

  test "should update tag_category" do
    patch company_tag_category_url(@tag_category), params: { ... }
    assert_redirected_to company_tags_url
  end

测试失败(其他控制器也有同样的问题:

the test fails (same issue in other controller also:

 FAIL["test_should_update_tag_category", #<Minitest::Reporters::Suite:0x00007f973befd100 @name="TagCategoriesControllerTest">, 62.38744100002805]
 test_should_update_tag_category#TagCategoriesControllerTest (62.39s)
        Expected response to be a <3XX: redirect>, but was a <200: OK>
        test/controllers/tag_categories_controller_test.rb:44:in `block in <class:TagCategoriesControllerTest>'

我的 create 操作具有完全相同的重定向逻辑,但测试是这样的:

My create action has the exact same redirect logic but the test is like this:

  test "should create tag_category" do
    assert_difference('TagCategory.count') do
      post company_tag_categories_url, params: { ... }
    end
    assert_redirected_to company_tags_url
  end

我似乎在这里遗漏了一些明显的东西.我尝试了 follow_redirect! 但这没有用.断言看到补丁返回 200 而不是接下来的重定向.

I seem to be missing something obvious here. I tried follow_redirect! but that didn't work. The assert is seeing the patch return 200 NOT the redirect that follows.

赏金更新

在其他测试中发现这个 - 这个工作正常(在浏览器中重定向并且可以在日志中看到重定向):

Finding this in other tests - this one works fine (both redirect in the browser and can see the redirect in the logs):

控制器:

  # PATCH/PUT /wbs/1
  def update
    authorize @wbs
    if @wbs.update(wbs_params)
      redirect_to @wbs, notice: 'Work breakdown structure was successfully updated.'
    else
      render :edit
    end
  end

测试:

  test "should update work_breakdown_structure" do
    patch work_breakdown_structure_url(@work_breakdown_structure), params: { work_breakdown_structure: { description: @work_breakdown_structure.description } }
    assert_redirected_to work_breakdown_structure_url(@work_breakdown_structure)
  end

这个失败了:

控制器:

  # PATCH/PUT /wells/1
  def update
    authorize @well
    if @well.update(well_params)
      redirect_to @well, notice: 'Well was successfully updated.'
    else
      render :edit
    end
  end

测试:

  test "should update well" do
    patch well_url(@well), params: { well: { description: @well.description } }
    assert_redirected_to well_url(@well)
  end

推荐答案

在您的控制器方法中,您有一个控制流来检查 @tag_category 实例是否已成功更新.如果是,它会重定向到 company_tags_url.如果不是,它会呈现 :edit 视图.

Inside your controller method, you have a control flow which checks if the @tag_category instance was successfully updated. In case it is, it redirects to company_tags_url. In case it's not, it renders the :edit view.

我的猜测是模型没有得到更新,控制器正在响应 else 块下的条件(执行 render 时,rails 将响应 200).

My guess is that the model is not getting updated and the controller is responding with the condition under the else block (rails will respond with a 200 when executing render).

不要渲染编辑视图,而是尝试将用户重定向到 edit_company_tag_path(@tag_category) ,如果是这种情况,您的测试将失败,不是因为它期待 3XX 响应,而是因为它是重定向到错误的页面.

Instead of rendering the edit view, try redirecting the user to edit_company_tag_path(@tag_category) , and if that's the case your test will fail not because it was expecting a 3XX response, but because it was redirected to the wrong page.

这篇关于MiniTest 控制器更新 - 预期响应为 &lt;3XX:redirect&gt;,但为 &lt;200:OK&gt;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆