【问题标题】:RSpec tests pass individually but fail as suite because of ARGVRSpec 测试单独通过,但由于 ARGV 而作为套件失败
【发布时间】:2011-08-23 04:24:58
【问题描述】:

我有三个 RSpec2 测试文件,每个文件都单独通过。但是使用rspec spec(或jruby -S rspec spec)运行套件会失败。

问题:ARGV 被设置为["spec"] 并使用spec 参数运行我的程序会改变其行为。我尝试在我的测试中处理这个问题:

before(:each) do
  ARGV.clear  # also tried: ARGV.delete_if { |val| true }
end

但我代码中的puts ARGV 语句表明ARGV 仍被设置为["spec"]

我还创建了一个spec/spec_helper.rb 文件:

RSpec.configure do |config|
  config.before(:suite) do
    ARGV.clear
  end
end

结果相同。当我单独运行测试时, ARGV 是空的。但是当我运行rspec spec 时,ARGV["spec"]

可能相关背景:我在 rbenv 下运行。

【问题讨论】:

  • ARGV.clear 直接放入我的代码后,测试套件运行正常。当我运行单个测试文件时,将ARGV.clear 放在 RSpec 中有效。为什么 RSpec 在作为测试套件运行时不会清除 ARGV?!?!

标签: ruby rspec rspec2


【解决方案1】:

重写您的代码,以便在您正在测试的方法中不提及 ARGV。

例如,如果您需要测试是否可以解析“play_jukebox”,那么就这样做

def test_play_jukebox
  parse_options(["play_jukebox"])
end

在你的 bin 文件中,有

if $0 == __FILE__
  parse_options(ARGV)
end

【讨论】:

  • 感谢您的回复,但我的代码需要处理 ARGV,因为传递命令行参数是 API 的一部分。所以我需要用各种 ARGV 来测试它,包括一个空的 ARGV,对吧?问题是 ARGV.clear 在我运行单个测试文件时有效,但在我运行测试套件时无效。
  • 为什么不能只将数组传递给 API?
  • 我可能错过了您的观点,并且我可能将您与我对“API”的使用混淆了。我会更具体一点:“play_jukebox”、“play_jukebox ~/Music/JAZZ/Art_Tatum”和“play_jukebox at”都是我的程序的有效命令行调用(第一个播放默认目录树,后两个播放Art Tatum 目录树)。测试第一次调用需要 ARGV 为空,不是吗?
  • 太棒了!谢谢,安德鲁。几天后我会离开电网,但会在几天后尝试一下,然后告诉你结果如何(除非艾琳得到我!让我们希望这件事能出海)。
猜你喜欢
  • 2018-05-06
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多