ruby-on-rails - 在 RSpec 中编写请求规范的正确方法是什么?

标签 ruby-on-rails ruby ruby-on-rails-3 rspec rspec2

tl;dr: 跳到最后一段

最近一直在尝试使用RSpec的request specs做一些更有针对性的测试。

我的测试主要是这样的:

  • 通用 cucumber 功能规范,即用户转到带有评论的帖子,对评论点赞,作者获得积分
  • model specs 当模型实际上具有某些功能时,即 User#upvote(comment)
  • controller specs 我在其中 stub 了大部分内容,只是试图确保代码按照我期望的方式运行
  • view specs 当 View 中有一些复杂的东西时,例如仅在用户尚未投票时呈现 upvote 链接,这些被 stub 为好吧

问题是当我有一些导致错误的特定场景时,一切似乎都在我无法重现它的模型/ View 层中工作。

这迫使我编写一个集成测试,我也可以在 Cucumber 中进行。一旦我能够实际重现它,问题就出现了,我需要弄清楚为什么会这样。这通常意味着在测试中尝试,改变不同的东西,看看会发生什么。

例如,创建一个由尝试投票的用户拥有的评论,尝试用过期的 session 投票等等。然而,用 Cucumber 编写这些真的很痛苦,因为需要编写一个场景然后详细说明每个步骤。

在这一点上,我更喜欢写一个请求规范,因为它更底层并且允许我直接做事。问题是,我不太确定如何正确编写请求规范,或者规则是什么。

这里有一个简单的例子:

visit login_path
fill_in "Username", :with => user.username
fill_in "Password", :with => user.password
click_button "Log in"

对比

post sessions_path(:username => user.username, :password => user.password)

或者更底层的东西,比如

session[:user_id] = user.id # this actually doesn't work, but the idea is there

这两个示例都实现了相同的目的,它们都会让用户登录。我知道选择哪个的答案是基于我需要测试的内容,但这并没有回答正确的、传统的方式做这个。

我一直在尝试查找有关请求规范的信息,但并未在任何地方进行真正的描述。 The RSpec book不包括它们,the RSpec documentation也不说话。

编写请求规范的正确方法是什么?我什么时候应该使用 capybara ,什么时候只使用 Rails 的 #get#post 方法而不是单击按钮和访问路径?

最佳答案

对于请求规范,我认为惯例是坚持测试用户行为和界面交互,这意味着加载页面、填写表单等。网站用户不能直接设置 session 或与变量交互,所以你的也不应该请求规范。

我经常试图通过在请求规范中发布或设置变量来跳过页面加载和形成交互(为了速度,尤其是繁重的 ajax 规范),但这确实破坏了请求规范的目的。

如评论所述,您应该在其他规范类型中测试特定的 Controller / View 行为。

关于ruby-on-rails - 在 RSpec 中编写请求规范的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9055093/

相关文章:

ruby-on-rails - 在 Rails 3 中将 UTC 转换为本地时间

ruby-on-rails - ActiveRecord has_and_belongs_to_many : find models with all given elements

ruby - 从第二次出现的字符拆分字符串

mysql - 对数据映射器查询进行基准测试

ruby - 在 ruby 中有点敲打

ruby-on-rails-3 - 带文件上传的 Rails 3 多步表单

ruby-on-rails - 为 Ruby on Rails 设计 gem 安装

ruby-on-rails - factory_girl/rspec2 场景中的未定义方法 `each'

ruby-on-rails - 显示错误时访问模型的属性翻译

ruby-on-rails - File.open 和 YAML.load_file 显示同一文件的不同内容