Rspec. Тестовый код автоматически запускается после теста

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

Finished in 0 seconds (files took 0.1513 seconds to load) 
1 example, 0 failures 
CheckDisk OK:       # This comes from the 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" после последнего примера, но это не решение, потому что, когда я попытаюсь запустить много спецификационных файлов, он выйдет после первого. Как запустить только тестирование, не запуская плагин? Может быть, кто-то может мне помочь и показать, как справиться с такой проблемой? Спасибо.

1 ответ

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

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

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

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

expect { run }.to raise_error(SystemExit)
Другие вопросы по тегам