首页 > 解决方案 > MiniTest 控制器更新 - 预期响应为 <3XX: redirect>,但为 <200: OK>

问题描述

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

  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

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

 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操作具有完全相同的重定向逻辑,但测试是这样的:

  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 而不是随后的重定向。

赏金更新

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

控制器:

  # 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

标签: ruby-on-railsminitest

解决方案


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

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

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


推荐阅读