12

我正在编写 RSpec 测试,但我已经到了在不同网站上阅读不同意见的地步。当我们处理 spec/controllers 和 spec/models 目录时,RSpec 的目录结构很清楚,但是我得到的冲突信息处理的是测试视图。

我想把这些测试放在 spec/integration/ 目录中,但我读过它应该在 spec/integration 下,但另一本书说 spec/requests。这有关系吗?

为了使情况更加复杂,我已经阅读了有关命名测试的实际文件名的冲突信息!例如,如果我有一个名为“people”的控制器/模型/视图目录(我使用 haml),我应该像这样命名文件:

规范/集成/people.html.haml_spec.rb

然而,另一本书提出了这一点:

规范/请求/people_spec.rb

我想稍微解释一下 RSpec 中的命名约定以及为什么我应该命名视图测试特定名称,以及将它们放在规范/集成或规范/请求下是否重要。我觉得我在这里随风而去。

任何帮助是极大的赞赏。

4

2 回答 2

12

检查书籍的日期和编写它们的 RSpec 版本。随着时间的推移,命名结构略有变化。

根据rspec-rails的文档,请求规范可以进入 spec/requests、spec/api 或 spec/integration。我更喜欢将请求规范放在规范/请求中。

为了让事情变得更有趣,如果您将Capybara与 rspec-rails 一起使用,它将与 Capybara 1.x 的规范/请求和 Capybara 2 的规范/功能一起使用。

至于个别的规范文件名,当有一个特定的类被测试时,比如 Rails 模型,你应该使用类似的规范文件名:

app/models/user.rb->spec/models/user_spec.rb

查看规范应使用模板名称:

app/views/users/index.html.erb->spec/views/users/index.html.erb_spec.rb

命名空间模型应在规范文件路径中包含命名空间:

app/models/admin/user.rb->spec/models/admin/user_spec.rb

RSpec 脚手架生成器是显示这些规范所属位置的一个很好的指南。

当没有特定的测试类时,就像请求规范一样,恕我直言,您应该随意使用描述被测试事物的名称。例如spec/requests/place_an_order_spec.rb

于 2013-01-08T04:08:52.357 回答
2

rspec gem 读取的文件只是那些以文件夹_spec.rb以下的层次结构中的任何位置结尾的spec文件,只要层次结构的顶部是一个字母数字单词(即,spec/##/不会考虑名为的文件夹下的文件在生成规范。)这是实现这一点的相关代码行,在/gems/rspec-rails-2.14.1/lib/rspec/rails/tasks/rspec.rake

namespace :spec do
  types = begin
    dirs = Dir['./spec/**/*_spec.rb'].
           map { |f| g=f.sub(/^\.\/(spec\/\w+)\/.*/, '\\1') ; puts ">>> Found #{g}."; g }.
           uniq.
           select { |f| File.directory?(f) }
    Hash[dirs.map { |d| [d.split('/').last, d] }]
  end

所以之前文件名中的所有文本_spec.rb都是一个约定——它不会改变 Rails 处理文件的方式。

我必须更多地阅读代码才能弄清楚每个文件夹名称的重要性,在spec, 是 - 它被传递到创建的 Rake 规范任务,所以它被用于某些事情,但我不知道什么。

于 2014-03-05T00:27:32.350 回答