2016-10-26 4 views
0

У меня возникла проблема с тестированием плагина Sensu. Каждый раз, когда я запускаю rspec для тестирования плагина, он проверяет его, но в конце теста исходный плагин запускается автоматически. Так что у меня в консоли:Rspec. Проверенный код запускается автоматически после теста

Finished in 0 seconds (files took 0.1513 seconds to load) 
1 example, 0 failures 
CheckDisk OK:  # This comes from the plugin 

Краткое объяснение, как моя система работает: система Plugin вызова команды «WMIC», обрабатывает его, проверяет условия о параметрах диска и возвращает экзит статусы (ок, критическое, и т. д.) Rspec издевается над ответом системы и вводит во вход плагина. В конце rspec проверяет статус выхода плагина, когда задан вводный ввод.

Мой плагин выглядит следующим образом:

require 'rubygems' if RUBY_VERSION < '1.9.0' 
require 'sensu-plugin/check/cli' 

class CheckDisk < Sensu::Plugin::Check::CLI 
    def initialize 
    super 
    @crit_fs = [] 
    end 

    def get_wmic 
    `wmic volume where DriveType=3 list brief` 
    end 

    def read_wmic 
    get_wmic 
    # do something, fill the class variables with system response 
    end 

    def run 
    severity = "ok" 
    msg = "" 
    read_wmic 
    unless @crit_fs.empty? 
    severity = "critical" 
    end 
    case severity 
    when /ok/ 
     ok msg 
    when /warning/ 
     warning msg 
    when /critical/ 
     critical msg 
    end 
    end 
end 

Вот мой тест в Rspec:

require_relative '../check-disk.rb' 
require 'rspec' 

    def loadFile 
    #Load template of system output when ask 'wmic volume(...) 
    end 

    def fillParametersInTemplate (template, parameters) 
    #set mocked disk parameters in template 
    end 

    def initializeMocks (options) 
    mockedSysOutput = fillParametersInTemplate @loadedTemplate, options 
    po = String.new(mockedSysOutput) 
    allow(checker).to receive(:get_wmic).and_return(po) #mock system call here 
    end 

    describe CheckDisk do 
    let(:checker) { described_class.new } 
    before(:each) do 
     @loadedTemplate = loadFile 
     def checker.critical(*_args) 
      exit 2 
     end  
    end 

    context "When % of free disk space = 10 >" do 
    options = {:diskName => 'C:\\', :diskSize => 1000, :diskFreeSpace => 100}  
    it 'Returns ok exit status ' do  
     begin     
     initializeMocks options 
     checker.run 
     rescue SystemExit => e 
     exit_code = e.status 
     end 
     expect(exit_code).to eq 0 
    end 
    end 
end 

Я знаю, что я могу просто поставить «выход 0» после того, как в предыдущем примере, но это не решение, потому что, когда я попытаюсь запустить много файлов спецификаций, он выйдет после первого. Как начать только тест, не запуская плагин? Может быть, кто-то может мне помочь и показать, как справиться с такой проблемой? Спасибо.

ответ

0

Вы можете окурок оригинального плагина вызова и, возможно, вернуть фиктивный объект:

allow(SomeObject).to receive(:method) # .and_return(double) 

вы можете поместить его в before блоке, чтобы убедиться, что все утверждения разделят код.

Другое дело, что вы используете блоки rescue, чтобы поймать ситуацию, когда ваш код прерывается с ошибкой. Вместо этого следует использовать raise_error:

expect { run }.to raise_error(SystemExit) 
+0

Спасибо за ответ. Но код плагина все еще выполняется после последнего шага ... BTW: Как использовать make_error matcher для проверки кода выхода (независимо от того, плагин ли он возвращает 0,1 или 2)? – Piotr

+0

Это означает, что вы не издевались над правильным методом. Вы также можете разрешить выполнение кода и просто высмеять стандартный вывод ('allow (STDOUT) .to receive (: write)'). Это зависит от того, что вы хотите проверить. Что касается 'SystemExit', проверить код выхода невозможно. – smefju