RSpec文件和目录结构的命名约定

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

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

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

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

然而,另一本书暗示了这一点:

规格/请求/ people_spec.rb

我想对RSpec中的命名约定做一点解释,为什么我应该将视图测试命名为特定名称,以及将它们置于spec / integration或spec / requests之下是否重要。 我觉得我在这里随风而去。

任何帮助是极大的赞赏。

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

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

为了让事情变得更有趣,如果你使用带有rspec-rails的Capybara,它将适用于Capybara 1.x的规格/请求,以及Capybara 2的规格/function。

对于单个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

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

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

RSpec脚手架生成器是显示这些规格所属的良好指南。

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

rspec gem读取的文件只是那些以_spec.rb结尾的_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规范任务,因此它被用于某些东西,但我不知道我知道什么。