我有一个通过Bundler运行的RSpec套件,它使用Aruba测试了许多不同的命令行应用程序.它运行正常...只要被测试的命令本身不是使用Bundler在Ruby中编写的.但我无法弄清楚如何防止RSpec套件的bundler配置干扰自己使用Bundler的命令的执行 - 至少,不是没有极端措施.
我已经试过各种排列unset_bundler_env_vars和with_clean_env,都无济于事.这是我认为可行的技术示例:
describe 'my ruby app' do
before :each { unset_bundler_env_vars }
it 'should work' do
Bundler.with_clean_env { run_simple ruby_command_name }
end
end
Run Code Online (Sandbox Code Playgroud)
我也试过unset_bundler_env_vars没有with_clean_env,反之亦然,以防他们互相干扰.没有骰子.
我得到它的唯一方法是手动按摩Aruba的环境副本,如下所示:
before :all do
aruba.environment.tap do |env|
if env.include? 'BUNDLE_ORIG_PATH' then
env['PATH'] = env['BUNDLE_ORIG_PATH']
%w(BUNDLE_BIN_PATH BUNDLE_GEMFILE BUNDLE_ORIG_PATH GEM_HOME RBENV_DIR
RBENV_HOOK_PATH RUBYLIB RUBYOPT).each do |key|
env.delete key
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
肯定有更好的办法.测试套件和被测试的命令都不应该知道或关心对方编写的语言.我使用Aruba和Bundler的测试代码不需要知道如何bundle exec影响过程环境的细节.
那么我做错了什么?我该怎么做?
以下场景几乎总结了我的问题:
Scenario: problems with subprocesses
Given the date is 01/01/2012 10:31
When I run `ruby -e "puts Time.now"`
Then the output should contain "10:31"
Run Code Online (Sandbox Code Playgroud)
它归结为When I run ruby -e "puts Time.now"启动一个子进程,从而使我的所有Timecop.freeze存根都无效,因为它们只在主进程上工作.我需要以某种方式将当前上下文"注入"到运行的命令中,但我似乎无法想出任何东西.我在这里尝试不可能的事吗?
步骤:
require 'timecop'
Given /^the date is (\d+)\/(\d+)\/(\d+) (\d+):(\d+)$/ do |month, day, year, hour, minute|
Timecop.freeze(Time.local(year.to_i, month.to_i, day.to_i, hour.to_i , minute.to_i, 0))
end
Run Code Online (Sandbox Code Playgroud) 为了使用Cucumber作为命令行脚本,我按照提供的说明安装了aruba gem.它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了
require 'aruba/cucumber'
Run Code Online (Sandbox Code Playgroud)
在'features/env.rb'中
为了确保它的工作,我写了以下场景:
@announce
Scenario: Testing cucumber/aruba
Given a blank slate
Then the output from "ls -la" should contain "drw"
Run Code Online (Sandbox Code Playgroud)
假设事情应该失败.
它确实失败了,但由于错误的原因它失败了:
@announce
Scenario: Testing cucumber/aruba
Given a blank slate
Then the output from "ls -la" should contain "drw"
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[] (NoMethodError)
features/dataloader.feature:9:in `Then the output from "ls -la" should contain "drw"'
Run Code Online (Sandbox Code Playgroud)
任何人都有任何想法为什么这不起作用?这似乎是非常基本的阿鲁巴行为.
我在这里寻找建议或最佳实践.
有时我想使用不同的介词为2个不同的步骤提供相同的正则表达式/短语.我经常看到的案例是一个既有意义Given也有Then步骤有用的短语.
Given用于执行和操作的步骤(设置测试状态).并Then用于验证状态但不执行操作的步骤.我经常发现相同的措词适合两者.这样的短语的一个例子是"我登录了"
这是一个人为的设想
Scenario: Login is saved between sessions.
Given I am logged in
When I exit the application
And I start the application
Then I am logged in
Run Code Online (Sandbox Code Playgroud)
当然,这在步骤定义中不起作用,因为黄瓜不区分步骤谓词.
我已经玩弄了对所有碰撞Then步骤添加"验证" ,或者为所有重复Given步骤添加"那个" .但没有什么是正确的.
Given that I am logged in.
...
Then verify I am logged in.
Run Code Online (Sandbox Code Playgroud)
它当然有效,但我觉得我错过了一些不需要为我的大多数步骤都使用相同的"扩展谓词"的东西.
我正在制作一个执行 Rails 命令的 gem(rails g model Item例如)。当我在 Rails 项目中使用它时,一切正常。问题是在 Rails 项目之外的开发中对其进行测试。
我正在使用cucumberwitharuba来测试 CLI 命令是否执行正确的 Rails 命令并生成预期的文件。不幸的是,当我尝试测试该行为时,它失败了,因为没有 Rails 文件,并且命令需要在 Rails 项目内部运行才能工作。
我已向 gemspec 添加了 Rails 依赖项:
Gem::Specification.new do |spec|
spec.add_development_dependency 'rails', '~> 5.2.4'
end
Run Code Online (Sandbox Code Playgroud)
我考虑过在测试开始时创建一个新的 Rails 项目,然后在测试运行后删除它,但这似乎非常不方便。有一个更好的方法吗?
我正在构建一个Ruby命令行程序,并使用Cucumber和Aruba来测试它.Aruba包含一些非常方便的匹配器,因此我可以在.feature文件中用几行测试输出:
When I run `myprogram`
Then it should pass with:
"""
my program output
"""
Run Code Online (Sandbox Code Playgroud)
问题是我的程序可能包含数十行甚至数百行输出; 把所有这些都放在.feature文件中将使得阅读和导航变得更加困难(并且有点令人讨厌).在这种情况下,测试输出的推荐方法是什么?
Ruby-2.0.0p247 ActiveRecord-4.0.1 Cucumber 1.3.10 Aruba-0.5.3 SimpleCove-0.8.2
我们在NON-RAILS项目中使用Cucumber和Aruba,但仍使用ActiveRecord.我们的黄瓜功能可以在进程内和进程外执行代码.使用与生产中相同的加载程序序列通过bin中的启动存根执行进程外代码:
#!/usr/bin/env ruby
require 'bundler/setup'
Bundler.require
require 'pathname'
my_dir = Pathname.new(
File.join( File.dirname(
__FILE__ ), '../', 'lib/' ) ).realpath.to_s + '/'
require my_dir + File.basename( __FILE__ )
HllThForexRssFetch::Main.new( ARGV ).execute
#EOF
Run Code Online (Sandbox Code Playgroud)
我们的features/support/env.rb文件包含以下内容:
$ cat features/support/env.rb
# Must load and start simplecov before any application code
require 'simplecov'
SimpleCov.start do
add_filter "/features/"
add_filter "/libexec"
add_filter "/lib/hll_active_record/"
add_filter "/test/"
add_filter "/tmp/"
end
SimpleCov.command_name( "Cucumber Features" )
# Do not use cucumber/rails in standalone projects
#require 'cucumber/rails' …Run Code Online (Sandbox Code Playgroud)