ruby-on-rails-3 - 如何允许异常在 rspec 请求规范中冒泡

标签 ruby-on-rails-3 rspec

我想知道如何简单地允许所有异常在请求规范中间冒泡到 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 方法进行单元测试。这些会在更细粒度的层面上告诉您出了什么问题。

    功能测试:
  • 什么 : 页面不包含预期的内容
  • 为什么 : Controller Action 抛出错误

  • 单元测试:
  • 什么 : Controller Action 抛出错误
  • 为什么 :有人忘记将该文件放入项目(或其他)
  • 关于ruby-on-rails-3 - 如何允许异常在 rspec 请求规范中冒泡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12081218/

    相关文章:

    sql - Ruby on Rails : Finding the sum of a column in a returned search query

    ruby-on-rails - 带有载波上传字段的工厂

    ruby-on-rails - Rails 查看规范 : referenced partials of inherited controllers aren't found

    rspec - 如何强制运行忽略 :focus tag 的所有 RSpec 规范

    sql - 两个表都需要使用 "where"进行 RoR 表连接

    ruby-on-rails - 获取 will_paginate 在第一页上定义自定义偏移量

    ruby-on-rails - 性能:最小化数据库命中

    ruby-on-rails - 在 Ruby Rspec 自动化中集成数据库清洁器 gem 的问题

    ruby-on-rails - Rails Rspec 测试中的多重期望

    ruby-on-rails - 在 RVM 下使用 Ruby 1.9.2 运行 Rails 时出错