Ruby 用rspec和vcr测试Thor脚本

Ruby 用rspec和vcr测试Thor脚本,ruby,rspec,thor,vcr,Ruby,Rspec,Thor,Vcr,我构建了一个Thor脚本,该脚本连接到HTTP API以执行一些非常简单的操作。我已经为后端编写了测试代码,但是Thor脚本基本上没有经过测试,这是非常不理想的 我的第一种方法是捕获命令本身的输出,并针对这种输出编写测试,结果测试的速度毫不奇怪地慢 expect(`bin/script foo`).to eq('bar') 然后我尝试同时使用webmock和vcr,但使用这种方法,这些框架都不会被调用,即使我模拟了确切的请求,模拟也没有被使用,很可能是因为webmock和vcr都无法挂接到th

我构建了一个Thor脚本,该脚本连接到HTTP API以执行一些非常简单的操作。我已经为后端编写了测试代码,但是Thor脚本基本上没有经过测试,这是非常不理想的

我的第一种方法是捕获命令本身的输出,并针对这种输出编写测试,结果测试的速度毫不奇怪地慢

expect(`bin/script foo`).to eq('bar')
然后我尝试同时使用
webmock
vcr
,但使用这种方法,这些框架都不会被调用,即使我模拟了确切的请求,模拟也没有被使用,很可能是因为
webmock
vcr
都无法挂接到thor脚本中

有人找到了解决这个问题的好办法吗?直接调用Thor脚本(
Thorclass.action('bar')
)就足够了,但我还没有找到一种方法。 有什么建议吗?提前谢谢。

托尔是个包装工
  • 我倾向于将Rake、Thor和friends视为代码的另一个接口
  • 我把我的Thor/Rake代码保持得尽可能小
  • 所有生产代码都保存在一个标准的Ruby类中
  • 这意味着通过VCR进行单元测试变得非常容易
  • 还允许您在另一个接口(例如Rails控制器)中重用生产代码
例子 雷神包装器
bin/seed

#!/usr/bin/env ruby
require "thor"

class Seed < Thor
  desc "budgets", "Seeds budgets"
  def budgets
    puts 'Seeding currencies...'
    SeedBudgets.new.call
    puts 'Done.'
  end
end

Seed.start
class SeedBudgets
  def initialize
    # I find an initialize helpful for injecting dependencies
  end

  def call
    # Code goes here
  end
end
require 'minitest/autorun'
require 'vcr'

VCR.configure do |config|
  config.cassette_library_dir = 'fixtures/vcr_cassettes'
  config.hook_into :webmock
end

class SeedBudgetsTest < Minitest::Test
  def test_seeds_one_budget
    VCR.use_cassette('one_budget_from_api') do
      SeedBudgets.new.call
      assert_equal 1, Budget.count
    end
  end
end
单元测试
test/services/seed\u-test.rb

#!/usr/bin/env ruby
require "thor"

class Seed < Thor
  desc "budgets", "Seeds budgets"
  def budgets
    puts 'Seeding currencies...'
    SeedBudgets.new.call
    puts 'Done.'
  end
end

Seed.start
class SeedBudgets
  def initialize
    # I find an initialize helpful for injecting dependencies
  end

  def call
    # Code goes here
  end
end
require 'minitest/autorun'
require 'vcr'

VCR.configure do |config|
  config.cassette_library_dir = 'fixtures/vcr_cassettes'
  config.hook_into :webmock
end

class SeedBudgetsTest < Minitest::Test
  def test_seeds_one_budget
    VCR.use_cassette('one_budget_from_api') do
      SeedBudgets.new.call
      assert_equal 1, Budget.count
    end
  end
end
要求“小型测试/自动运行”
需要“录像机”
VCR.configure do | config|
config.caste_library_dir='fixtures/vcr_casteds'
config.hook_进入:webmock
结束
类seedBudgetTest
这将允许您将命令行界面与实际代码分离

然后Thor就变成了一个非常薄的包装器,围绕着你的实际代码

请随意发布更详细的代码,我可以提供更多帮助。:)