标签: aruba

使用Aruba和Bundler测试基于Ruby的CLI

我有一个通过Bundler运行的RSpec套件,它使用Aruba测试了许多不同的命令行应用程序.它运行正常...只要被测试的命令本身不是使用Bundler在Ruby中编写的.但我无法弄清楚如何防止RSpec套件的bundler配置干扰自己使用Bundler的命令的执行 - 至少,不是没有极端措施.

我已经试过各种排列unset_bundler_env_varswith_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影响过程环境的细节.

那么我做错了什么?我该怎么做?

ruby rspec bundler aruba

9
推荐指数
1
解决办法
160
查看次数

使用cucumber/aruba/timecop测试命令行应用程序:如何注入上下文

以下场景几乎总结了我的问题:

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)

ruby time-travel cucumber aruba

6
推荐指数
1
解决办法
837
查看次数

检查"命令"的输出应包含NilClass的意外崩溃

为了使用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)

任何人都有任何想法为什么这不起作用?这似乎是非常基本的阿鲁巴行为.

ruby bdd cucumber aruba

5
推荐指数
1
解决办法
817
查看次数

为"给定"和"然后"步骤定义相同的短语

我在这里寻找建议或最佳实践.

有时我想使用不同的介词为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)

它当然有效,但我觉得我错过了一些不需要为我的大多数步骤都使用相同的"扩展谓词"的东西.

cucumber aruba

5
推荐指数
1
解决办法
1592
查看次数

如何测试依赖于 Rails 并使用 Rails 命令的 gem

我正在制作一个执行 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 rubygems ruby-on-rails cucumber aruba

5
推荐指数
1
解决办法
755
查看次数

如何使用具有大量输出的Cucumber测试Ruby命令行程序?

我正在构建一个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 cucumber aruba

4
推荐指数
1
解决办法
1751
查看次数

如何配置Cucumber/Aruba使用SimpleCov?

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)

ruby cucumber aruba simplecov

2
推荐指数
1
解决办法
783
查看次数