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


103

使用RSpec测试我的控制器时,我遇到了一个问题-response.body调用始终返回空字符串。在浏览器中,所有内容均可正确渲染,黄瓜功能测试似乎可以正确处理,但RSpec每次都失败。

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

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

至于版本,Rails 2.1.0,RSpec 1.2.7。

Answers:


194

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

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

describe YourController do
  render_views
  ...
end

2
谢谢,正是我所需要的。
2009年

2
我已经与Rails合作多年,现在我终于了解了控制器规范和请求规范之间的区别。谢谢!
布赖恩·安德伍德


2

当我处理类似的问题时(导致我想到了这个问题),我发现有多种方法可以对同一只猫进行皮肤护理。换句话说,您不必检查正文,而是可以检查Flash的内容。

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

可能等同于:

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

在我看来,后者似乎更灵活,因为它可以以任何一种方式运行,但可能并非在所有情况下都适用。

干杯,

约翰


2

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

解决此问题的方法之一是确保启用文件中的render_views设置rails_helper.rb。这样,您就可以使其在所有测试中都可以全局工作。

RSpec.configure do |config|
  config.render_views
end

或使用render_views声明单个组:

describe User do
  render_views
end

您可以在此处了解更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.