Ich habe ein Problem mit dem Testen des Sensu Plugins. Jedes Mal, wenn ich rspec starte, um das Plugin zu testen, teste es, aber am Ende des Tests wird das ursprüngliche Plugin automatisch gestartet. So habe ich in meiner Konsole:Rspez. Der getestete Code wird automatisch nach dem Test gestartet
Finished in 0 seconds (files took 0.1513 seconds to load)
1 example, 0 failures
CheckDisk OK: # This comes from the plugin
Kurze Erklärung, wie mein System funktioniert: Plugin Rufsystem ‚wmic‘ Befehl, verarbeitet sie, prüft die Bedingungen über die Plattenparameter und gibt den Exit-Status (ok, kritisch, usw.) Rspec verspottet die Antwort vom System und setzt den Eingang des Plugins. Am Ende prüft rspec den Status des Plugin-Exits, wenn die mockige Eingabe gegeben wird.
Mein Plugin sieht wie folgt aus:
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
Hier ist mein Test in Rspec ist:
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
Ich weiß, dass ich nur "exit 0" setzen können nach dem letzten Beispiel, aber das ist keine Lösung, denn wenn ich versuche, viele spec-Dateien zu starten, wird es nach dem ersten beendet. Wie starte ich nur den Test, ohne das Plugin zu starten? Vielleicht kann mir jemand helfen und zeigen, wie man mit solch einem Problem umgeht? Danke.
Vielen Dank für die Antwort. Aber der Plugin-Code wird immer noch nach dem letzten Schritt ausgeführt ... BTW: Wie raise_error matcher zu verwenden, um den Exit-Code zu überprüfen (ob Plugin 0,1 oder 2 zurückgibt)? – Piotr
Es bedeutet, dass Sie die richtige Methode nicht verspottet haben. Sie können auch zulassen, dass der Code ausgeführt wird, und nur eine Standardausgabe ausgeben ('allow (STDOUT) .to receive (: write)'). Es hängt davon ab, was Sie wirklich testen möchten. Wie bei 'SystemExit' ist es nicht möglich, den Exit-Code zu überprüfen. – smefju