Тестирование скрипта Thor с помощью rspec и vcr - PullRequest
0 голосов
/ 18 декабря 2018

Я создал скрипт Thor, который подключается к HTTP API для выполнения очень простых действий.Я закодировал тесты для бэкэнда, но скрипт Thor в основном не тестировался, что является довольно неоптимальным.

Мой первый подход состоял в том, чтобы захватить выходные данные самой команды и записать тест для такого вывода, итоговые тестынеудивительно медленно.

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

Затем я попытался использовать и webmock, и vcr, но, используя этот подход, ни одна из этих платформ не вызывается, даже если я высмеиваю точный запрос, макет не используется, скорее всего,потому что и webmock, и vcr не могут подключиться к сценарию тор.

Кто-нибудь нашел хорошее решение для этого?Непосредственного вызова сценария Тора (Thorclass.action('bar')) было бы достаточно на мой вкус, но я не нашел способа сделать это.Любое предложение?Заранее спасибо.

1 Ответ

0 голосов
/ 18 декабря 2018

Thor - это обертка

  • Я склонен видеть Rake, Thor и друзей в качестве другого интерфейса для вашего кода
  • Я сохраняю свой код Thor / Rake настолько малым, насколько это возможно
  • Весь производственный код хранится в стандартном классе Ruby
  • Это означает, что модульное тестирование с помощью видеомагнитофона становится невероятно простым
  • Также позволяет повторно использовать производственный код в другом интерфейсе: например, Railsконтроллер

Пример

Thor wrapper

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

Подробнее окомандная строка Thor увидеть это отличное прохождение

Код продукции

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

Это позволит вам отделить интерфейс командной строки от фактического кода.

Тогда Тор станет очень тонкой оболочкой для вашего фактического кода.

Не стесняйтесь размещать более подробный код, и я могу помочь больше.:)

...