2016-11-23 51 views
5

我有一個腳本,用於封裝RSpec 3.4.4中的測試,並使它們在十秒後超時。如何設置全球RSpec元數據?

TIMEOUT = 10 

RSpec.configure do | config | 
    config.around do |example| 
    timeout = Float(example.metadata[:timeout]) rescue TIMEOUT 
    begin 
     Timeout.timeout(timeout) { example.run } 
    rescue Timeout::Error 
     skip "Timed out after #{timeout} seconds" 
    end 
    end 
end 

這個腳本是在一箇中心位置 - ~/lib/spec_helper.rb - 並且是在我的倉庫require d由spec_helper秒。

我想兩秒或(另一個例子)不是在所有後,能夠在一個倉庫範圍級別配置example.metadata[:timeout],有所有其規格超時(例如)。

我試過將它設置爲.rspec中的一個選項 - 這對我來說是一個理想的解決方案 - 但它當然不能識別這樣的自定義選項。我希望命令行能夠完成同樣的事情。

有沒有辦法爲測試套件中的所有示例設置元數據?

回答

1

除在RSpec的內部黑客攻擊,這可能不是一個好主意,你可以做到這一點的唯一方法是通過濫用可用的選項:因爲它允許

標籤的選擇是一個很好的候選人本你輸入鍵/值對。這樣做的好處是它可以在.rspec文件中設置,並且可以通過命令行參數覆蓋。例如,

.rspec配置

--format documentation 
--color 
--tag timeout:10 
--require spec_helper 

命令行

rspec --tag timeout:2 

你一定要小心,確保你從過濾器或所有測試刪除標籤將被過濾掉...要使用這個,在你的情況下你只需要做:

RSpec.configure do | config | 
    timeout = config.filter.delete(:timeout) || 10 

    config.around do |example| 
    begin 
     Timeout.timeout(timeout) { example.run } 
    rescue Timeout::Error 
     skip "Timed out after #{timeout} seconds" 
    end 
    end 
end 

在此特定示例中,將超時設置爲零將禁用超時。

從高到低的優先順序是command line arg>.rspec configuration>default specified in your config block

+0

「在這個特殊的例子設置超時爲零將禁止使用超時。」實際上,正如你[最初]寫的那樣,將超時設置爲零將停止該示例的運行。幸運的是,你所需要做的就是除去'unless'子句,因爲'Timeout.timeout(0){...}'不會超時。 – PJSCopeland

+0

啊我其實不太確定...我會改變答案 – David

1

define_derived_metadata選項不正是你想要什麼:

define_derived_metadata(*filters) {|metadata| ... } ⇒ void 

RSpec.configure do |config| 
# Tag all groups and examples in the spec/unit directory with 
# :type => :unit 
config.define_derived_metadata(:file_path => %r{/spec/unit/}) do |metadata| 
    metadata[:type] = :unit 
end 
end 

檢查它rubydoc.info

+0

太棒了!唯一缺少的是打開或關閉它的簡單方法。 – PJSCopeland

+0

您可以擴展此解決方案,並演示如何從rspec文件和命令行配置自定義選項?我正在努力從文檔中找出它。 – David