RSpec 控制器测试 - 空白 response.body

Posted

技术标签:

【中文标题】RSpec 控制器测试 - 空白 response.body【英文标题】:RSpec controller testing - blank response.body 【发布时间】:2010-11-06 23:28:00 【问题描述】:

在使用 RSpec 测试我的控制器时遇到一个问题 - response.body 调用总是返回一个空字符串。在浏览器中,一切都正确呈现,黄瓜功能测试似乎正确,但 RSpec 每次都失败。

对响应对象的其他期望,例如response.should render_template('index')通过没有任何问题。

你们中有人遇到过这个问题吗?也许可以通过其他方式获得响应html

版本方面,Rails 2.1.0,RSpec 1.2.7。

【问题讨论】:

【参考方案1】:

默认情况下,rspec-rails 会侵入 Rails 以防止它实际呈现视图模板。您应该只测试您的操作的行为并过滤您的控制器测试,而不是模板渲染的结果——这就是视图规范的用途。

但是,如果您希望让控制器规格像应用程序一样呈现模板,请使用 render_views 指令:

describe YourController do
  render_views
  ...
end

【讨论】:

谢谢你,正是我需要的。 我已经使用 Rails 多年了,现在我终于明白了控制器和请求规范之间的区别。谢谢! 谢谢,当我测试rails API时,render_views工作正常,它渲染了json模板并将结果放在response.body中,如果不使用render_views,response.body == ""【参考方案2】:

RSpec 2+:如果您想检查端到端 - 响应正文的 url - 使用 request spec 而不是 controller spec。

【讨论】:

【参考方案3】:

当我处理类似的问题时(导致我提出这个问题),我突然想到有不同的方法可以给同一只猫剥皮。换句话说,您可以检查闪存的内容,而不是检查正文。

response.body.should =~ /Invalid email or password/

可能等同于:

flash[:alert].should == "Invalid email or password"

对我来说,后者似乎更灵活一些,因为它可以以任何一种方式运行,但它可能并不适用于所有情况。

干杯,

约翰

【讨论】:

【参考方案4】:

默认情况下,RSpec-rails 配置禁用控制器规范的模板渲染

解决此问题的方法之一是确保在您的rails_helper.rb 文件中启用render_views 设置。通过这种方式,您可以使其能够在您的所有测试中全局运行。

RSpec.configure do |config|
  config.render_views
end

或者使用 render_views 声明一个单独的组:

describe User do
  render_views
end

您可以阅读有关此here 的更多信息。

【讨论】:

以上是关于RSpec 控制器测试 - 空白 response.body的主要内容,如果未能解决你的问题,请参考以下文章

为啥在测试 RSPEC 时 JBuilder 不返回 JSON 中的响应正文

RSpec2 错误代码测试

如何使用 RSpec 测试 WebSockets(使用 Pusher)?

使用 RSpec & Rails 测试给定布局的渲染

使用 Javascript 进行 Rspec 控制器测试

Rspec:测试所有控制器动作