Rails:如何测试lib /目录中的代码?

Kap*_*old 48 unit-testing ruby-on-rails

我有一个模型从解析器对象获取其数据.我认为解析器类应该存在于lib /目录中(尽管我可以说服它应该存在于其他地方).问题是:我的单元应该在哪里测试解析器类?每次运行rake测试时,如何确保它们运行?

Mat*_*ley 26

在我正在研究的Rails应用程序中,我决定将测试放在test\unit目录中.我也将按模块/目录嵌套它们,例如:

lib/a.rb   => test/unit/a_test.rb
lib/b/c.rb => test/unit/b/c_test.rb
Run Code Online (Sandbox Code Playgroud)

对我来说,这是最后阻力的路径,因为这些测试无需进行任何其他更改.

  • 这不再适用于Rails 5 (5认同)
  • @Qqwy因为这对Rails 5不起作用,在Rails 5.2上测试`lib`的最佳实践是什么. (3认同)

Pau*_*rey 23

这是一种方式:

lib/tasks/test_lib_dir.rake使用以下内容创建

namespace :test do

  desc "Test lib source"
  Rake::TestTask.new(:lib) do |t|    
    t.libs << "test"
    t.pattern = 'test/lib/**/*_test.rb'
    t.verbose = true    
  end

end
Run Code Online (Sandbox Code Playgroud)

模仿libdir下testdir 的结构,用相应的测试替换lib代码.

运行rake test:lib以运行lib测试.

如果要在调用时运行所有测试rake test,可以将以下内容添加到新的rake文件中.

lib_task = Rake::Task["test:lib"]
test_task = Rake::Task[:test]
test_task.enhance { lib_task.invoke }
Run Code Online (Sandbox Code Playgroud)


小智 8

我希望做同样的事情,但是使用rspec和autospec,需要花一些时间来弄清楚他们在哪里获得了目录/文件模式的列表,这些模式决定了要运行哪些测试文件.最终我在lib/tasks/rspec.rake中找到了这个:86

  [:models, :controllers, :views, :helpers, :lib, :integration].each do |sub|
    desc "Run the code examples in spec/#{sub}"
    Spec::Rake::SpecTask.new(sub => spec_prereq) do |t|
      t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
      t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
    end
  end
Run Code Online (Sandbox Code Playgroud)

当rpsec.rake文件配置为查看spec/lib时,我已将测试放在新的spec/libs目录中.只需重命名libs - > lib就可以了!