我想知道如何简单地允许所有异常在请求规范中间冒泡到 rspec。
我希望有一个例子可以说明这一点。假设我有以下请求规范和相应的应用程序代码:
# user_browses_posts_spec.rb
feature 'User views a post' do
scenario 'this should fail with route missing' do
FactoryGirl.create(:post)
visit(root_path)
click_on('View Post')
end
end
# config/routes.rb
MyApp::Application.routes.draw do
root to: 'posts#index'
# notice I have not defined a :posts resource, so post_path should raise NoMethodError
end
# assume a totally standard app/controllers/posts_controller.rb
# app/views/posts/index.html.erb
<% @posts.each do |post| %>
<%= link_to 'View Post', post_path(post) %> # this line should fail
<% end %>
当我运行测试时,我看到的是:
Failure/Error: click_on('View Post')
Capybara::ElementNotFound:
no link or button 'View Post' found
这是因为当从应用程序内部引发 NoMethodError 时,规范运行器没有发现问题,因为它看到了正常的 Rails 开发错误页面(带有错误消息、回溯、参数等)。
但我想要在我的终端中看到的是:
Failure/Error: visit(root_path)
NoMethodError:
undefined method `post_path' for #<PostsController:0x007fea60a779c8>
那么,我的问题是如何完全禁用 Rails 错误处理,以便 NoMethodError 一直冒泡到 rspec?
谢谢!
最佳答案
我不相信这是可能的。但是,我也不认为您真的希望访问()即使可以冒泡 Controller 错误,因为访问()旨在用于功能测试。
请求规范在它们自己的上下文中运行,这意味着 visit()
方法像浏览器一样访问 URL,而不是直接调用 Controller 方法。因此,请求将通过所有 Rack 中间件和 Rails 路由层。那里的错误处理行为与现实世界中的行为相同,这对于像这样的“功能性”测试来说是一件好事。
考虑一下当您手动测试这样的事情时会发生什么。当您转到特定(损坏的)URL 时,浏览器中会显示什么?两件事之一:
事实上,在这两种情况下,浏览器都会收到一个 HTML 页面。
接下来,您查看此页面并对自己说“嘿,这不是我期望的页面!”。此时,您已经确定出了什么问题:页面不是您所期望的。然后,您必须在日志中进行调查,或阅读开发模式错误页面上的堆栈跟踪,以确定为什么会出错。
规范本质上是在做同样的事情,但是是自动化的。
visit()
call 工作得很好,它确实产生了某种 HTML 页面。测试然后尝试通过尝试单击链接来验证它是否包含某些特定内容,这就是测试失败的地方。这一步在概念上与您说“嘿!”相同。只有在页面加载并且它不包含您期望的内容之后。如果您愿意,您可以直接对 Controller 方法进行单元测试。这些会在更细粒度的层面上告诉您出了什么问题。
功能测试:
单元测试:
关于ruby-on-rails-3 - 如何允许异常在 rspec 请求规范中冒泡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12081218/