109

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

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

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

至于版本,Rails 2.1.0,RSpec 1.2.7。

4

4 回答 4

206

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

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

describe YourController do
  render_views
  ...
end
于 2009-06-30T18:54:07.860 回答
6

RSpec 2+:如果要检查端到端 - url 到响应正文 - 使用请求规范而不是控制器规范

于 2013-07-09T06:55:42.703 回答
2

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

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

可能是等效的检查:

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

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

干杯,

约翰

于 2012-09-13T18:20:28.350 回答
2

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

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

RSpec.configure do |config|
  config.render_views
end

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

describe User do
  render_views
end

您可以在此处阅读有关此内容的更多信息。

于 2018-03-01T13:44:39.687 回答