如何计算RSpec示例过滤:焦点在git钩子?

时间:2016-05-24 09:40:04

标签: ruby git rspec rspec3

我正在尝试编写一个Git预提交钩子,如果有一个用foo-*标记的示例,它就不会让用户提交。

使用RSpec的API(即使它是私有的,也没关系),有没有办法找出:focus过滤器的例子数量?

我找到了example_count-instance_method。它可能很有用,但我不确定如何从外部脚本调用它。

3 个答案:

答案 0 :(得分:4)

Here is Overcommit pre_commit挂钩,它使用RSpec私有API来查找带有:focus过滤器的规范:

require 'rspec'

module Overcommit
  module Hook
    module PreCommit
      # NOTE: This makes use of many methods from RSpecs private API.
      class EnsureFocusFreeSpecs < Base
        def configure_rspec(applicable_files)
          RSpec.configure do |config|
            config.inclusion_filter = :focus
            config.files_or_directories_to_run = applicable_files
            config.inclusion_filter.rules
            config.requires = %w(spec_helper rails_helper)
            config.load_spec_files
          end
        end

        def run
          configure_rspec(applicable_files)

          return :pass if RSpec.world.example_count.zero?

          files = RSpec.world.filtered_examples.reject {|_k, v| v.empty?}.keys.map(&:file_path).uniq
          [:fail, "Trying to commit focused spec(s) in:\n\t#{files.join("\n\t")}"]
        end
      end
    end
  end
end

答案 1 :(得分:2)

我不是调用RSpec Ruby代码,而是使用--dry-run标志通过RSpec的命令行界面来实现。这是一个预提交钩子,它就是这样做的:

#!/bin/bash
if ! (rspec --dry-run --no-color -t focus:true 2>&1 | grep -q '^0 examples'); then
  echo "Please do not commit RSpec examples tagged with :focus."
  exit 1
fi

答案 2 :(得分:1)

不完全确定这是否有助于或回答问题,但我目前使用this set of githooks来确保我不会犯明显的错误,而pull request会为{{{{}}添加检查RSpec文件中的1}} / :focus / focus: true