Ruby 用rspec和vcr测试Thor脚本
我构建了一个Thor脚本,该脚本连接到HTTP API以执行一些非常简单的操作。我已经为后端编写了测试代码,但是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
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就变成了一个非常薄的包装器,围绕着你的实际代码
请随意发布更详细的代码,我可以提供更多帮助。:)