我构建了一个连接到HTTP API的Thor脚本来执行一些非常简单的操作。我已经为后端编写了测试代码,但Thor脚本基本上是未经测试的,这是相当次优的。
我的第一种方法是捕获命令本身的输出,并针对这些输出编写测试,结果测试的速度并不令人惊讶。
expect(`bin/script foo`).to eq('bar')
然后,我尝试同时使用webmock
和vcr
,但是使用这种方法,这些框架都没有被调用,即使我模拟了确切的请求,模拟也没有使用,很可能是因为webmock
和vcr
都无法连接到雷神脚本。
有没有人找到一个很好的解决方案?直接调用雷神脚本(Thorclass.action('bar')
)对我来说已经足够了,但我还没有找到这样做的方法。有什么建议吗?提前谢谢。
发布于 2018-12-19 04:48:00
雷神是一个包装器
示例
Thor包装器
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
For more details on command line Thor see this excellent walkthrough
产品代码
lib/services/seed_budgets.rb
class SeedBudgets
def initialize
# I find an initialize helpful for injecting dependencies
end
def call
# Code goes here
end
end
单元测试
test/services/seed_budgets_test.rb
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
这将允许您将命令行界面与实际代码解耦。
然后,Thor就变成了实际代码的一个非常薄的包装器。
请随时发布更详细的代码,我可以提供更多帮助。:)
https://stackoverflow.com/questions/53836815
复制相似问题