2016-10-26 5 views
0

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.

Antwort

0

Sie können das Original-Plugin Aufruf Stummel und Rück optional ein Dummy-Objekt:

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

Sie es im before Block, um sicherzustellen, setzen kann, dass alle Behauptungen den Code teilen.

Eine andere Sache ist, dass Sie rescue Blöcke verwenden, um die Situation zu erfassen, wenn Ihr Code mit einem Fehler abbricht. Sie sollten stattdessen raise_error Matcher verwenden:

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

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

+0

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

Verwandte Themen