SimpleCov 只是向您展示 Ruby 的 Coverage 库收集了什么,正如您对问题的评论所说,这些事情已被执行,但我也觉得这令人沮丧 - 我不希望加载但未使用的类为 40 % 覆盖率。
我的解决方案是删除仅在加载过程中出现的覆盖范围。我们使用的是 Rails,所以我们首先加载应用程序中的每个文件(这在 Rails 中很容易,有一个 eager_load 配置);拍摄当时的报道快照;运行测试套件;然后最后在 simplecov 输出之前从最终结果中扣除快照。在加载快照中恰好覆盖一次并且在最终结果中恰好覆盖一次的任何行都将被删除。
下面是我不久前拼凑起来的一个自定义 SimpleCov 格式化程序,它可以完成这项工作。这有点像 hack,因为它与 gem 的内部结果对象混淆了,所以请注意,它对于新版本可能不稳定,但它适用于我们当前的 simplecov (0.16.1)。另请注意,由于它使用Coverage.peek_result
它需要 Ruby 2.3 或更高版本。
通过将其设置SimpleCovWithoutLoadingFormatter
为 simplecov 的格式化程序并在SimpleCovWithoutLoadingFormatter.take_load_snapshot
加载应用程序的每个文件后立即在测试套件设置调用中使用它。
require 'simplecov'
class SimpleCovWithoutLoadingFormatter
def self.take_load_snapshot
@coverage_load_lines_mask = Coverage.peek_result
end
def self.coverage_load_lines_mask
@coverage_load_lines_mask
end
def format(result)
if self.class.coverage_load_lines_mask&.any?
result_merge_count = result.command_name.split(',').count
result.files.each do |source_file|
_file, load_mask = self.class.coverage_load_lines_mask.detect { |file, _load_mask| file == source_file.filename }
next unless load_mask
source_file.coverage.each_with_index do |count, i|
source_file.coverage[i] = nil if count&.positive? && count&.==(load_mask[i] * result_merge_count)
end
end
end
SimpleCov::Formatter::HTMLFormatter.new.format(result)
end
end