在rspec中使用`puts response`进行堆栈级别太深

时间:2012-09-18 10:48:28

标签: ruby-on-rails-3 rspec rspec-rails

在控制器测试中遇到rspec和rails的奇怪问题。每当我们在规范中添加puts response时,它就会输出大量的这些

200
{"Content-Type"=>"text/html; charset=utf-8"}
200
{"Content-Type"=>"text/html; charset=utf-8"}
200
{"Content-Type"=>"text/html; charset=utf-8"}
200
{"Content-Type"=>"text/html; charset=utf-8"}

然后以SystemStackError: stack level too deep失败。通过pry检查响应效果很好,打印其他东西也很好。

升级到最新的rspec(2.11)没有什么区别。我们注意到puts会在响应上调用to_a,它返回一个[@status, @header, self]的数组,所以它会以某种方式导致这种奇怪的递归?

更新:这是gist代码+规范

1 个答案:

答案 0 :(得分:5)

我相信你遇到了机架中的错误。 [rack_response].flatten进入无限循环。有关详细信息,请参阅这些问题:

解决方案是不对响应对象本身设置任何期望,而是单独设置对状态,标题或正文的期望,例如:

last_response.status.should eq(200)
last_response.body.should include("some text")
last_response.headers.should include("Content-Type" => "text/plain")