我有一个项目来创建模板ruby项目。
我正在使用serverspec并希望验证模板的行为。
但是,使用command(`rake -T`)
失败。如果我手动执行命令,它将按预期工作。
调试,当测试在Serverspec中运行时,它发现错误的Gemfile
- 它正在使用我项目中的Gemfile(.
),而不是生成的目录(target/sample_project
)
如何使用Serverspec / Rspec测试调用rake
或bundler
命令?
示例代码:
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 :(得分: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