【问题标题】:Testing a Thor script with rspec and vcr使用 rspec 和 vcr 测试 Thor 脚本
【发布时间】:2018-12-18 15:59:59
【问题描述】:

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

我的第一种方法是捕获命令本身的输出并针对此类输出编写测试,结果测试速度很慢。

expect(`bin/script foo`).to eq('bar')

然后我尝试同时使用webmockvcr,但是使用这种方法,这些框架都不会被调用,即使我模拟了未使用模拟的确切请求,很可能是因为webmockvcr无法挂钩到 thor 脚本。

有没有人找到一个很好的解决方案?直接调用 Thor 脚本 (Thorclass.action('bar')) 就足以满足我的口味,但我还没有找到方法。 有什么建议吗?提前致谢。

【问题讨论】:

    标签: ruby rspec thor vcr


    【解决方案1】:

    Thor 是一个包装器

    • 我倾向于将 Rake、Thor 和朋友视为代码的另一个接口
    • 我让我的 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
    

    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 成为您实际代码的非常薄的包装器。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      相关资源
      最近更新 更多