如何从Serverspec / RSpec测试中调用bundler命令

时间:2017-03-07 11:22:40

标签: ruby serverspec

我有一个项目来创建模板ruby项目。

我正在使用serverspec并希望验证模板的行为。

但是,使用command(`rake -T`)失败。如果我手动执行命令,它将按预期工作。

调试,当测试在Serverspec中运行时,它发现错误的Gemfile - 它正在使用我项目中的Gemfile(.),而不是生成的目录(target/sample_project

如何使用Serverspec / Rspec测试调用rakebundler命令?

示例代码:

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

1 个答案:

答案 0 :(得分:0)

Bundler提供了运行外部shell命令的说明:http://bundler.io/v1.3/man/bundle-exec.1.html

使用Bundler.with_clean_env而不是Serverspec,使用rspec可以运行bundler / rake任务。

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