Wie kann ich einen Komponententest für einen Chef-Provider schreiben?Unit testet einen Chef-Provider
Bisher verwendet unsere Einheitenteststrategie ChefSpec für Rezepte, und wir füllen die meisten interessanten Logik für unsere Anbieter in Bibliotheken aus, um die Logik testbarer zu machen. Wir stoßen jedoch immer noch auf Probleme, bei denen unsere Anbieter andere Ressourcen aufrufen (neben anderen einfachen logischen Problemen). Zum Beispiel:
action :run do
helper = Helper.new
template '/etc/hosts' do
source 'hosts.erb'
variables ({
"host" => @new_resource.host,
"ip_address" => node['ipaddress']
})
only_if { helper.update_hosts }
end
service 'httpd' do
action :restart
end
end
(nicht echter Code ist, nur ein triviales Beispiel)
Was wir möchten, dass diese Anbieter tun testet in Isolation ist für logische Fehler zu überprüfen. ChefSpec hat die Möglichkeit, in einen LWRP zu treten, aber es sieht so aus, als würde uns dies dazu zwingen, den LWRP in ein Rezept zu bringen, und viele unserer Kochbücher sind im Grunde LWRP-Bibliotheken ohne Rezepte. Wir würden auch gerne eine saubere Trennung in unseren Tests beibehalten, daher ist es offensichtlich, welche Komponente fehlgeschlagen ist, wenn man sich den Dateinamen angesehen hat.
Außerdem wäre es nett, wenn der Test automatisch fehlschlagen würde, wenn Syntaxfehler in der LWRP-Definition vorliegen. Zum Beispiel:
action :run do
template '/etc/hosts/' do
source_whoops 'hosts.erb'
action :whoops
end
end
Es wäre wirklich schön, wenn die obige Aussage der Test aufgrund der Attributnamen scheitern würde dazu führen, falsch definiert wird, und der Aktionsname nicht vorhanden (wie ChefSpec).
Die einzige Lösung, die ich mir ausgedacht habe, ist im Grunde ein "Test Cookbook" zu erstellen - ein separates Kochbuch, das jeden LWRP 1: 1 mit einem einzigen Rezept definiert, damit ChefSpec auf diese Art und Weise eintreten kann. Es scheint eine vernünftige, aber weniger als ideale Lösung zu sein.
Ja. Das ist genau das, was ich gesagt habe :) – sethvargo