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