首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用rspec和vcr测试Thor脚本

使用rspec和vcr测试Thor脚本
EN

Stack Overflow用户
提问于 2018-12-19 00:00:00
回答 1查看 530关注 0票数 2

我构建了一个连接到HTTP API的Thor脚本来执行一些非常简单的操作。我已经为后端编写了测试代码,但Thor脚本基本上是未经测试的,这是相当次优的。

我的第一种方法是捕获命令本身的输出,并针对这些输出编写测试,结果测试的速度并不令人惊讶。

代码语言:javascript
复制
expect(`bin/script foo`).to eq('bar')

然后,我尝试同时使用webmockvcr,但是使用这种方法,这些框架都没有被调用,即使我模拟了确切的请求,模拟也没有使用,很可能是因为webmockvcr都无法连接到雷神脚本。

有没有人找到一个很好的解决方案?直接调用雷神脚本(Thorclass.action('bar'))对我来说已经足够了,但我还没有找到这样做的方法。有什么建议吗?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-19 04:48:00

雷神是一个包装器

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

示例

Thor包装器

bin/seed

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
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

代码语言:javascript
复制
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就变成了实际代码的一个非常薄的包装器。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53836815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档