2017-06-20 5 views
0

Ich schreibe ein Kochbuch mit benutzerdefinierten Ressourcen, die (unter anderem) validiert SSH-Schlüssel durch ssh-keygen. Ich muss das Szenario testen, in dem der Benutzer ungültige Eingaben eingibt, und die Ressource sollte entsprechend der Ausnahme erhöhen, also suche ich nach einer Möglichkeit, zu überprüfen, ob 'folgende Eingabe gegeben wird ... Chef läuft fehlgeschlagen'.Testen Koch Kochbuch Fehler

Wenn ich alles richtig verstehe, bedeutet Test Kitchen, dass jede Konvergenz erfolgreich endet, und ChefSpec impliziert, dass Ressourcen nie wirklich ausgeführt werden (also werden meine ssh-keygen Aufrufe nie aufgerufen).

Gibt es herkömmliche Möglichkeiten, einen solchen Fall zu testen?

+0

Ja, die shellout Ruf als jede andere Bibliothek spöttisch, wie dokumentiert [hier] (https://github.com/chefspec/chefspec#ruby-libraries-file-fileutils-etc) auf ChefSpec readme. Und erwarte, dass es eine Ausnahme macht, sollte dies der ganzen Sache entsprechen. – Tensibai

+0

Sollte dies auf eine Antwort kopieren :) – coderanger

+0

@Tensibai das eigentliche Problem ist nicht verspotten, ich denke, ich war zu präzise über Kochbuch Interna reden. Ich muss testen, dass meine Ressource wie erwartet auf verschiedene Antworten von ssh-keygen reagiert, aber ChefSpec führt meine Ressource nicht aus - soweit ich weiß, ist dies der absichtlich nur Modus von ChefSpec. In der Tat kann ich testen, ob meine Ressource irgendwo aufgerufen wurde, kann "only_if"/"not_if" Wächter testen, aber nicht das Ressourcenverhalten selbst. – Etki

Antwort

1

Um die inneren Bits einer custom_resource zu testen, müssen Sie ChefSpec an step_into melden. Sie haben Recht. ChefSpec führt im Normalfall keine Provider aus.

Um einen richtigen Test auf einen Fehler, sollten Sie expect(:chef_run).to raise_error als here in the documentation

Quote der Dokumentation für step_into beschreiben:

Um die Aktionen, die von Ihrem LWRP ausgesetzt zu laufen, müssen Sie ausdrücklich Runner sagen hinein zu Schritt:

require 'chefspec'

describe 'foo::default' do 
    let(:chef_run) do 
    ChefSpec::SoloRunner.new(step_into: ['my_lwrp']).converge('foo::default') 
    end 

    it 'installs the foo package through my_lwrp' do 
    expect(chef_run).to install_package('foo') 
    end 
end 

HINWEIS: Wenn Ihr Kochbuch LWRPs aussetzt, ist es sehr empfehlenswert Sie auch Bibliotheken/matchers.rb Datei erstellen, wie im „Verpackung Benutzerdefinierte Matchers“ weiter unten beschrieben. Sie sollten niemals einen Schritt in eine LWRP durchführen, es sei denn, Sie testen es. Niemals ein LWRP aus einem anderen Kochbuch von aufrufen!

Verwandte Themen