【问题标题】:RSpec naming conventions for files and directory structure文件和目录结构的 RSpec 命名约定
【发布时间】:2013-01-06 06:44:09
【问题描述】:

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

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

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

spec/integration/people.html.haml_spec.rb

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

spec/requests/people_spec.rb

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

非常感谢任何帮助。

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

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

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

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

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

    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.

    【讨论】:

    • 不应将查看规范格式化为spec/views/user.html.erb_spec.rb 而不是spec/views/user.html.erb?另外,spec/views/user.html.erb 似乎是一个奇怪的例子,spec/views/users/index.html.erb 不是更有意义吗?
    • 伙计们!如果我想为单个模型创建两个规格文件怎么办?例如:首先是范围,其次是一些逻辑......有什么建议吗? user_scopes_spec.rbuser_my_feature_name_spec.rb?
    【解决方案2】:

    rspec gem 读取的文件只是那些以_spec.rb 结尾的文件,并且只要层次结构的顶部是字母数字单词(即,在生成规范时不会考虑名为 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 规范任务,因此它被用于某事,但我不知道是什么。

    【讨论】:

    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2021-04-13
    • 2011-02-17
    • 1970-01-01
    • 2013-09-26
    相关资源
    最近更新 更多