У меня возникла проблема с тестированием плагина 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» после того, как в предыдущем примере, но это не решение, потому что, когда я попытаюсь запустить много файлов спецификаций, он выйдет после первого. Как начать только тест, не запуская плагин? Может быть, кто-то может мне помочь и показать, как справиться с такой проблемой? Спасибо.
Спасибо за ответ. Но код плагина все еще выполняется после последнего шага ... BTW: Как использовать make_error matcher для проверки кода выхода (независимо от того, плагин ли он возвращает 0,1 или 2)? – Piotr
Это означает, что вы не издевались над правильным методом. Вы также можете разрешить выполнение кода и просто высмеять стандартный вывод ('allow (STDOUT) .to receive (: write)'). Это зависит от того, что вы хотите проверить. Что касается 'SystemExit', проверить код выхода невозможно. – smefju