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+默认禁用该方法,需手动启用):
- 在
test/test_helper.rb中添加方法启用assigns:
class ActiveSupport::TestCase def assigns(key) @controller.instance_variable_get("@#{key}") end end
- 修改测试代码:
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
相关产品推荐
相关产品推荐

