如何从 Serverspec/RSpec 测试中调用捆绑器命令

how to invoke bundler commands from within a Serverspec/RSpec test

我有一个创建模板的项目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

Bundler 提供 运行 外部 shell 命令,记录在此处:http://bundler.io/v1.3/man/bundle-exec.1.html

运行 bundler/rake 任务可以使用 rspec 使用 Bundler.with_clean_env 而不是 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