我试图设置SimpleCov为3个应用程序生成报告,这些应用程序从当地gem共享大部分代码(模型,控制器),但每个应用程序使用的代码的规格都在每个./spec内部,而不是宝石本身。SimpleCov有多个应用程序 - 或者简而言之,Simplecov是如何工作的?
更清晰的例子。当我在app_1中运行bundle exec rspec spec时,它使用本地gem中的共享模型,我希望获得(准确)报告,了解此app_1在里面./spec中的所有规范。
本地gem在命名空间内也有一些属于app_2的模型,所以当我在app_1中运行测试套件时,我想跳过这些文件的报告。
我试图用app_1/spec/spec_helper中的以下代码来实现此目的。
# This couple of lines are needed to generate report for the models, etc. inside the local gem.
SimpleCov.adapters.delete(:root_filter)
SimpleCov.filters.clear
SimpleCov.adapters.define 'my_filter' do
root = SimpleCov.root.split("/")
root.pop
add_filter do |src|
!(src.filename =~ /^#{root.join("/")}/)
end
add_filter "/app_2_namespace/"
end
if ENV["COVERAGE"] == "true"
SimpleCov.start 'rails'
end
这有效,直到有些问题开始出现。
为什么我对宝石内的模型有85%的覆盖率,但规格在app_2内(我正在运行app_1内的规格)。
第一次是一个问题,当我试图改善模型,所以我点击报告,看到哪些行被发现,我试图解决它们在app_2/spec/namespace上编写测试/my_model_spec.rb。
但是这并没有什么区别,我尝试了一个更积极的测试,我删除了spec文件中的所有内容,但不知何故,我仍然获得了85%的覆盖率,所以my_model_spec.rb与my_model.rb的覆盖率结果。有点意外。
但由于该文件是在APP_2我决定SimpleCov.start块上添加过滤器上APP_1 spec_helper,如:
add_filter "/app_2_name_space/"
然后我移动到文件夹APP_2,并开始建立SimpleCov看看我会得到什么结果。他们变成了怪异的。
对于同一个模型,我得到了100%的覆盖率,我做了空白my_model_spec.rb文件的同样的测试,仍然得到了100%。所以这真的会发生,或者我不明白。
如何工作的呢?(with the Ruby 1.9 Coverage module你说,好吧,当我在本地运行的官方文档我得到不同的结果的例子,所以我觉得有一个错误或过时的文档存在)
ruby-doc: {"foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]}
locally: {"foo.rb"=>[1, 1, 10, nil, nil, 1, 0, nil, 1, nil]}
希望对于在应用程序代码某处进行评估的行,报告不会显示正面结果,而不管在哪里。
我认为预期的行为是,例如模型的结果都与这对控制器的规格,同样的事情,等
是这种情况?如果是这样,为什么我得到这个奇怪的结果。
或者你认为我的应用程序的结构可能会搞乱SimpleCov和Coverage吗?
感谢您花时间阅读本文,如果您需要更详细的信息,只需询问。
有问题从@TheDeadSerious回答了你的问题? – 2012-03-12 21:22:50