Диспетчерское действие Rails Controller Вне контекста HTTP (не в модульном тесте) - PullRequest
0 голосов
/ 12 июня 2018

Я поддерживаю зрелую кодовую базу, которая использует Rails в качестве API.Приложение Rails также делает некоторые вещи с MQTT, не в сети, не HTTP-протоколом в реальном времени.

Некоторые пользователи просили возможность имитировать те же команды REST по протоколу MQTT (избегая необходимости авторизациидважды и имеют два разных клиента протокола).

Я видел несколько проектов, , таких как API Facebook , "имитирующих" HTTP путем помещения частей HTTP-запроса в запрос с использованием JSON (например:иметь свойство "header" и "method" для полезной нагрузки JSON).Это именно то, что я хочу сделать, но вне контекста HTTP полностью.Это будет происходить в фоновом режиме, который обрабатывает сообщения MQTT.

Можно ли использовать ActionDispatch и друзей для имитации диспетчерской диспетчеризации в отдельности?

Мне трудно найти документацию покак создать экземпляр объекта ActionDispatch::Request в изоляции вне RSpec.

MyController.dispatch("create",
                     ActionDispatch::Request.new({"???" => "Can't find any docs on this one."}),
                     ActionDispatch::Response.new("?"))
# => RuntimeError: Missing rack.input

1 Ответ

0 голосов
/ 12 июня 2018

Ой, очень интересная проблема!

Моя первая идея состояла в том, чтобы подойти к нему задом наперед: так что создайте фальшивку Rack::Request или ActionDispatch::Request и затем заставите ее обработать?Предполагая, что он перейдет к нужному контроллеру и автоматически выполнит действие (поэтому вам не нужно вызывать его явно).Но, конечно, проблема остается: как создать Request :)

Итак, я просматривал тесты rails и нашел следующий фрагмент кода, который может помочь вам начать:

SimpleController.action("hello").call(
  "REQUEST_METHOD" => "GET",
  "rack.input" => -> {}
)

Источник: https://github.com/rails/rails/blob/85fcb663363cd27220e8bd3136973cc3408cf7d7/actionpack/test/controller/metal_test.rb

Насколько я понимаю, это означает, что вы можете передать всю среду фальшивого запроса в виде хэша с ключами, являющимися строками, верно?Таким образом, вы можете вывести env из правильного запроса и транспонировать соответственно.

Не уверен, что это действительно полезно.

...