我正在写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之下是否重要。我觉得我在这里随风而去。
非常感谢任何帮助。
答案 0 :(得分:11)
检查书籍的日期和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
。
答案 1 :(得分:1)
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规范任务,所以它正在用于某事,但我不知道是什么。