You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails网站测试阶段重定向失败:控制器测试URL偏移问题

Rails测试重定向失败问题解决

问题原因

测试代码里的@story并非刚创建的那条记录,导致断言的URL ID和实际重定向的URL ID不匹配。控制器执行create方法时会创建新的Story实例并赋值给@story,但测试代码里的@story是独立变量,要么未初始化,要么指向测试前置的旧数据,所以出现ID偏移1的情况。

修复方案

方案1:从数据库获取刚创建的记录

修改测试代码,在POST请求完成后,直接从数据库取出最新创建的Story,用它做重定向断言:

test "adds a story" do
  assert_difference "Story.count" do
    post stories_path, params: {
      story: {
        name: 'test story',
        link: 'http://www.test.com/'
      }
    }
  end
  # 获取刚创建的story
  new_story = Story.last
  assert_redirected_to story_url(new_story)
  assert_not_nil flash[:notice]
end

方案2:获取控制器的实例变量

如果想直接用控制器里的@story,可以通过assigns(:story)获取(Rails 5+默认禁用该方法,需手动启用):

  1. 在test/test_helper.rb中添加方法启用assigns:
class ActiveSupport::TestCase
  def assigns(key)
    @controller.instance_variable_get("@#{key}")
  end
end
  1. 修改测试代码:
test "adds a story" do
  assert_difference "Story.count" do
    post stories_path, params: {
      story: {
        name: 'test story',
        link: 'http://www.test.com/'
      }
    }
  end
  # 获取控制器中的@story实例
  assert_redirected_to story_url(assigns(:story))
  assert_not_nil flash[:notice]
end

两种方案里,方案1更可靠,不依赖控制器的实例变量,能避免后续控制器代码变更导致测试失效。

内容的提问来源于stack exchange,提问作者ISwearImCool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:32:45