Rspec - Rails - 如何遵循重定向

Jon*_*röm 40 testing rspec ruby-on-rails web-testing

有谁知道如何使rspec遵循重定向(在控制器规范中)?(例如,test/unit有follow_redirect!)

我试过"follow_redirect!" 和"follow_redirect"但只得到

undefined method `follow_redirect!' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1:0xb6df5294>
Run Code Online (Sandbox Code Playgroud)

例如:
当我创建帐户时,页面将重定向到帐户页面,我的新帐户应位于列表的顶部.

it "should create an account" do
  post :create, :name => "My New Account"
  FOLLOW_REDIRECT!
  response.code.should == "200"
  accounts = assigns[:accounts]
  accounts[0].name.should == "My New Account"
end
Run Code Online (Sandbox Code Playgroud)

但是FOLLOW_REDIRECT!需要改为实际工作的东西.

zet*_*tic 65

我认为这是rspec-rails控制器测试的默认行为,因为您可以设置对响应状态和/或路径的期望,并测试是否成功.

例如:

it "should create an account" do
  post :create
  response.code.should == "302"
  response.should redirect_to(accounts_path)
end
Run Code Online (Sandbox Code Playgroud)

  • 现在我可以测试重定向是否有效.但那不是我要找的.我想,rspec自动跟踪重定向,并且我希望从重定向页面获得成功/错误.如果您测试一个强制执行https的控制器,这一点很重要.在那种情况下,我甚至不会离开我的域名.有没有想过怎么做? (2认同)

小智 27

您可以使用访问重定向位置

response.headers['Location']
Run Code Online (Sandbox Code Playgroud)

然后你可以直接请求.

  • 这是对OP的唯一直接答案.其他人说明**应该做什么,但这是唯一一个告诉我如何做所要求的事情.如果有人像我一样从Google查询来到这里,这会很有帮助. (6认同)

and*_*myr 19

如果要测试重定向,则要移出rspec-rails域.

您可以使用Webrat或其他一些集成测试框架来测试它.

无需借助集成测试即可解决此问题的最简单方法可能是模拟导致重定向的方法.

  • 实际上这个答案*是正确的,而我的答案是正确的.我的回答只显示了如何验证是否发生重定向 - OP询问如何在遵循重定向后测试响应的内容. (4认同)

小智 5

如果您想遵循重定向使用请求规范(相当于 Test::Unit 中的集成测试),则该规范超出范围。

在请求规范中follow_redirect!和在 Test::Unit 中一样有效。

或者,如果您想立即重定向,请使用_via_redirect动词后缀,例如:

post_via_redirect :create, user: @user
Run Code Online (Sandbox Code Playgroud)