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)