Rails - Как заглушить метод для всего набора тестов?

Прямо сейчас я нахожусь в процессе рефакторинга, и я борюсь со следующим.

У меня есть такой класс:

class Example
  def self.some_method
    if Rails.env.test?
      true
    else
      hit_external_service
    end
  end
 end

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

class ActiveSupport::TestCase
  setup do
    Example.stub(:some_method).returns(true)
  end
end

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

Я также подумал о том, чтобы извлечь логику подключения внешнего сервиса к другому классу и затем использовать этот класс в качестве инъецируемой зависимости, поэтому для всего набора тестов я мог бы сделать:

Example.external_service = DummyImplementation

а затем для реальных испытаний я мог бы сделать:

Example.external_service = RealImplementation

но это кажется излишним, так как логика на самом деле только 3 строки.

Так какие-нибудь предложения? Есть ли что-то простое, что, возможно, я не вижу?

1 ответ

Для создания методов-заглушек я обычно создаю заглушку в моем конкретном тестовом примере, которая в ней нуждается, но затем отключаю метод при разборке. Как это:

требует 'test_helper'

class MyTest < ActiveSupport::TestCase

  def teardown
    Example.unstub(:some_method)
  end

  test "not hitting the service" do
    Example.stub(:some_method).returns(true)
    assert Example.some_method
  end

  test "hitting the service" do
    assert Example.some_method
  end

end
Другие вопросы по тегам