Rspec:有没有办法在before(:each)块之后但在实际it块之前执行代码?

时间:2015-07-01 15:15:45

标签: ruby rspec configuration

我正在尝试编写一个工具来衡量我们的功能规范所做的http请求数量(如果它们为0,我们可以将它们移到更便宜的javascript规范中)。

我遇到的问题是我不想识别在before(:each)块中发出的请求。我想在执行before(:each)块之后但在'it-block'执行之前将我的计数变量设置为0。

现在代码看起来像这样:

RSpec.configure do |config|

  config.before(:each) do |test|
    HTTPSpec::Counts= 0 
  end

  WebMock.after_request do |request_signature, response|
    HTTPSpec::Counts += 1 
  end

end

1 个答案:

答案 0 :(得分:1)

这是一个可能适合你的黑客攻击:

require 'rspec'

$should_get_reset = 0
$should_not_get_reset = 0

# monkey-patch :before
module RSpec::Core::Hooks
    alias_method :original_before, :before
    def before(*args, &block)
        original_before *args do
            block.call
            $should_get_reset = 0
        end
    end

    # Alias :append_before to the new :before, because they do it here:
    # https://github.com/rspec/rspec-core/blob/9f99b6aa24e24edd530035868e258abd24d88385/lib/rspec/core/hooks.rb#L201
    alias_method :append_before, :before
end

describe "Hi" do
    before do
        $should_get_reset = 1
        $should_not_get_reset = 1
    end

    it "mom" do
        $should_get_reset += 1
        $should_not_get_reset += 1
        expect($should_get_reset).to eq(1)
        expect($should_not_get_reset).to eq(2)
    end
end

您可以将其保存在文件中(例如foo_spec.rb)并运行rspec foo_spec.rb以查看其是否有效。实际上,您可能希望将猴子修补程序移动到规范帮助程序或支持文件。