我有一个从解析器对象获取数据的模型。我认为解析器类应该存在于lib /目录中(尽管我可以说服它应该存在于其他地方)。问题是:我的单元应该在哪里测试解析器类?每次运行rake测试时,我如何确保它们运行?
答案 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:run
或rake
运行时重新定义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
文件夹或任何其他自定义文件夹的文件夹结构由您决定。但我更喜欢在课堂上复制它们:lib
与test/lib
匹配,app/form_objects
与test/form_objects
匹配。
答案 6 :(得分:-3)
使用:
[spring] rake test:all
运行所有测试,包括您创建的目录(如[root]/test/lib/
)。
如果tou没有使用它,则省略[spring]
。