SimpleCov просто показывает вам, что собирает библиотека Cuberage в Ruby, и, как сказано в комментариях к вашему вопросу, эти вещи выполнены, но я тоже нахожу это разочаровывающим - я не хочу загруженный класс , но не используется, для покрытия 40%.
Мое решение состоит в том, чтобы удалить покрытие, которое происходит только в процессе загрузки. Мы используем Rails, поэтому мы начнем с загрузки каждого файла в приложении (это легко сделать в rails, есть конфигурация eager_load); сделать снимок освещения в то время; запустить набор тестов; затем, наконец, вычесть снимок из конечного результата перед выводом simplecov. Любая строка, покрытая ровно один раз в моментальном снимке загрузки и ровно один раз в конечном результате, удаляется.
Ниже приведен пользовательский форматировщик SimpleCov, который я недавно собрал вместе и который выполняет эту работу. Это что-то вроде хака, поскольку он портится с внутренним результирующим объектом гема, поэтому имейте в виду, что он может быть нестабильным для новых версий, но он работает для нас с текущим 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