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

时间:2009-04-28 16:51:54

标签: ruby-on-rails unit-testing

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

7 个答案:

答案 0 :(得分:26)

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

lib/a.rb   => test/unit/a_test.rb
lib/b/c.rb => test/unit/b/c_test.rb

对我而言,这是最后一次阻力的路径,因为这些测试无需进行任何其他更改即可运行。

答案 1 :(得分:22)

这是一种方式:

使用以下

创建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

模仿lib目录下test目录的结构,用相应的测试替换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 }

答案 2 :(得分:8)

我希望做同样的事情,但是使用rspec&amp; 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

当rpsec.rake文件配置为查看spec / lib时,我已将测试放在新的spec / libs目录中。只需重命名libs - &gt; lib做了伎俩!

答案 3 :(得分:3)

简单而干净的方法就是在test / unit / lib下创建一个目录。然后创建test作为与lib / foo.rb对应的test / unit / lib / foo_test.rb。不需要新的rake任务,如果需要,可以嵌套更多目录以匹配lib目录结构。

答案 4 :(得分:3)

截至Rails 4.0

rake test:all         # Run all tests in any subdir of `test` without resetting the DB
rake test:all:db      # Same as above and resets the DB

Rails 4.1开始,在test:runrake运行时重新定义rake test以包含其他任务:

# lib/tasks/test.rake

namespace :test do
  Rake::Task["run"].clear
  task run: ["test:units", "test:functionals", "test:generators", "test:integration", "test:tasks"]

  ["tasks"].each do |name|
    Rails::TestTask.new(name => "test:prepare") do |t|
      t.pattern = "test/#{name}/**/*_test.rb"
    end
  end
end

在给定示例中定义rake test:tasks还有额外的好处。

Rails 4.2开始,test:run包含test的所有子目录,包括运行rake test,以及rake的所有子目录。

答案 5 :(得分:0)

要定义其他rake任务以从自定义文件夹运行测试,您也可以使用命令rake test:all运行它们。测试lib文件夹或任何其他自定义文件夹的文件夹结构由您决定。但我更喜欢在课堂上复制它们:libtest/lib匹配,app/form_objectstest/form_objects匹配。

答案 6 :(得分:-3)

使用:

[spring] rake test:all

运行所有测试,包括您创建的目录(如[root]/test/lib/)。

如果tou没有使用它,则省略[spring]