使用RSpec测试我的控制器时遇到问题 - response.body调用总是返回一个空字符串。在浏览器中,一切都正确呈现,黄瓜特征测试似乎正确,但RSpec每次都失败。
对响应对象的其他期望,例如response.should render_template('index')
没有任何问题。
你们之前有没有遇到过这个问题?也许响应html可以通过其他方式获得?
对于版本,Rails 2.1.0,RSpec 1.2.7。
答案 0 :(得分:178)
默认情况下,rspec-rails攻击Rails以阻止实际呈现视图模板。你应该只测试你的行为和行为的行为。过滤你的控制器测试,而不是模板渲染的结果 - 这就是视图规范的用途。
但是,如果您希望将控制器规格渲染模板设置为应用程序通常的模板,请使用render_views
指令:
describe YourController do
render_views
...
end
答案 1 :(得分:3)
RSpec 2+:如果您想检查端到端 - url到响应正文 - 请使用request spec而不是controller spec。
答案 2 :(得分:2)
当我处理一个类似的问题(这导致我提出这个问题)时,我突然发现有不同的方法可以让同一只猫皮肤受伤。换句话说,您可以检查闪存的内容,而不是检查正文。
response.body.should =~ /Invalid email or password/
可能与以下内容相同:
flash[:alert].should == "Invalid email or password"
对我而言,后者似乎更灵活,因为它会以任何一种方式运行,但在所有情况下可能都不合适。
干杯,
约翰
答案 3 :(得分:1)
默认情况下,RSpec-rails配置禁用渲染控制器规范的模板
解决此问题的方法之一是确保在rails_helper.rb
文件中启用RSpec.configure do |config|
config.render_views
end
设置。通过这种方式,您可以在所有测试中全局工作。
describe User do
render_views
end
或者使用render_views声明单个组:
[[],[],[]]
您可以阅读有关此here的更多信息。