Как заглушить метод для класса, сгенерированного во время выполнения с помощью minitest Rails?
Я хочу остановить вызов стороннего компонента, но нахожу это довольно сложным в мини-тесте Rails. Я начну с самого основного вопроса выше. Вот некоторый очень упрощенный псевдокод, чтобы лучше объяснить, что я пытаюсь сделать:
class RequestController < ActionController::Base
def schedule
# Parse a bunch of params and validate
# Generate a unique RequestId for this request
# Save Request stuff in the DB
# Call 3rd party scheduler app to queue request action
scheduler = Scheduler.new
submit_success = scheduler.submit_request
# Respond to caller
end
end
Поэтому я пишу интеграционные тесты для RequestController и хочу заглушить вызов scheduler.submit_request. Мой тестовый код выглядит примерно так:
def test_schedule_request
scheduler_response = 'Expected response string for RequestId X'
response = nil
Scheduler.stub :submit_request, scheduler_response do
# This test method calls the RequestController schedule route above
response = send_schedule_request(TEST_DATA)
end
# Validate (assert) response
end
Кажется довольно простым, но, очевидно, я не могу заглушить метод для класса, который не существует (пока). Итак, как мне заглушить метод класса для объекта, созданного во время выполнения в тестируемом коде?
2 ответа
Как заметил Вимша, сначала нужно заглушить инициализацию класса. Я не мог заставить его код работать, но этот пересмотренный тестовый код ниже имеет ту же идею:
def test_schedule_request
scheduler_response = 'Expected response string for RequestId X'
response = nil
scheduler = Scheduler.new
Scheduler.stub :new, scheduler do
scheduler.stub :submit_request, scheduler_response do
# This test method calls the RequestController schedule route above
response = send_schedule_request(TEST_DATA)
end
end
# Validate (assert) response
end
Спасибо дэйв
Я не уверен насчет минитеста. Но в rspec вам также нужно будет заглушить часть инициализации и вернуть поддельный объект планировщика.
Вот как я бы сделал это в rspec.
mock_scheduler = double("scheduler")
Scheduler.stub(:new).and_return(mock_scheduler)
mock_scheduler.stub(:submit_request).and_return(response)
Другой вариант будет
Scheduler.any_instance.stub(:submit_request).and_return(response)