Я нашел способ сделать это.Это хак, но, похоже, работает хорошо.
В IntegrationTest Rails определяет методы get / post / etc helpers, которые вы затем используете в тестовых примерах для подключения вашего приложения Rails.Чтобы ActiveResource использовал методы-помощники вместо реального HTTP-запроса, я включил метод AR-запроса.Я использовал глобальную переменную для отправки текущего контрольного примера и для доступа к вспомогательным методам.
# Include this in test_helper.rb into ActiveSupport::TestCase class
module ActiveResourceMonkeyPatching
module ::ActiveResource
# We need to monkey patch AR:Connection to use IntegrtionTest helper
# methods (get, post, ...) instead of Net:Http
class Connection
private
# Makes a request to the remote service.
def request(method, path, *arguments)
result = ActiveSupport::Notifications
.instrument('request.active_resource') do |payload|
payload[:method] = method
payload[:request_uri] =
"#{site.scheme}://#{site.host}:#{site.port}#{path}"
payload[:result] =
$test.send(method,
path,
{ params: arguments.first, headers: arguments.last }) &&
$test.response
end
handle_response(result)
rescue Timeout::Error => e
raise TimeoutError.new(e.message)
rescue OpenSSL::SSL::SSLError => e
raise SSLError.new(e.message)
end
end
# Lets also predefine site so we don't need to configure those in test cases
class Base
self.site = 'http://www.example.com'
end
end
# We also monkey patch IntegrationTest to set the '$test' global variance which is
# needed in ActiveResource
class ActionDispatch::IntegrationTest
def setup
$test = self
super
end
end
end
С тех пор, как я начал патчить обезьяну, я также добавил еще несколько для передачи глобальной переменной и установки атрибута dummy site
.Фактический тестовый пример прост, см. Ниже.Поскольку мы выполняем это как обычный IntergrationTest, все исправления в пользовательской модели загружаются как обычно.
require 'test_helper'
module MyApp
class User < ActiveResource::Base
end
end
class UserFlowsTest < ActionDispatch::IntegrationTest
test "should get index" do
users = MyApp::User.all
assert_response :success
end
end
Это хак :). Использование патчей для обезьян означает, что вышеуказанное решение работает с текущими версиями Rails и ActiveResource и завершится неудачей, если и когда они будут обновлены.Если кто-то найдет другой способ решить эту проблему, мне было бы интересно узнать.