2017-03-07 2 views
-1

Ich habe ein Projekt, um eine Vorlage Ruby-Projekt zu erstellen.wie Bundler Befehle aus einem Serverspec/RSpec Test aufrufen

Ich verwende Serverspec und möchte das Verhalten der Vorlage überprüfen.

Die Verwendung von command(`rake -T`) schlägt jedoch fehl. Wenn ich den Befehl manuell ausführe, funktioniert es wie erwartet.

Debuggen, wenn der Test in Serverspec läuft, findet es die falschen Gemfile - das Gemfile von meinem Projekt verwendet (.), nicht das erzeugte Verzeichnis (target/sample_project).

Wie kann ich rake oder bundler Befehle mit einem Serverspec/Rspec Test aufrufen?

Beispielcode:

require "spec_helper" 
require 'serverspec' 
require 'fileutils' 

set :backend, :exec 
set :login_shell, true 

describe "Generated Template" do 
    output_dir='target' 
    project_dir="#{output_dir}/sample_project" 

    # Hooks omitted to create the sample_project 
    # and change working directory to `project_dir` 

    describe command('rake -T') do 
    its(:stdout) { should include "rake serverspec:localhost" } 
    its(:stdout) { should include "rake serverspec:my_app" } 
    end 
end 
+0

Könnten Sie 'cd target/sample_project && rake && cd -' zum Befehl hinzufügen? – Kris

+0

Ich habe das versucht. Ich habe tatsächlich einen runden Hook hinzugefügt, um das aktuelle Verzeichnis zu ändern: 'around (: example) do Dir.chdir (project_dir) end'. Dies funktioniert wie erwartet - ich habe ein anderes Beispiel, um zu überprüfen, ob das Arbeitsverzeichnis wie erwartet ist. – Tim

+0

Der Hook funktioniert möglicherweise nicht, weil ein neuer untergeordneter Prozess gestartet wird, der möglicherweise nicht dasselbe aktuelle Arbeitsverzeichnis wie der übergeordnete Prozess hat. Haben Sie versucht, das 'cd' in den Befehl einzufügen, damit es im Kontext des untergeordneten Prozesses ausgeführt wird? – Kris

Antwort

0

Bündler hat Bestimmung für die Ausführung von externen Shell-Befehle hier dokumentiert: http://bundler.io/v1.3/man/bundle-exec.1.html

Lauf Bündler/Rake Aufgaben möglich ist mit rspec Bundler.with_clean_env verwenden, statt Serverspec.

require 'bundler' 
require 'rspec' 
RSpec.describe "Generated Template" do 

    output_dir='target' 
    project_dir="#{output_dir}/sample_project" 

    around(:example) do |example| 
    #Change context, so we are in the generated project directory 
    orig_dir=Dir.pwd 

    Dir.chdir(project_dir) 
    example.run 
    Dir.chdir(orig_dir) 

    end 

    around(:example) do |example| 
    Bundler.with_clean_env do 
     example.run 
    end 
    end 

    it "should include localhost" do 
    expect(`rake -T 2>&1`).to include "rake serverspec:localhost" 
    end 
end 
Verwandte Themen