1

我维护一个使用 Rails 作为 API 的成熟代码库。Rails 应用程序还使用 MQTT(一种实时、非 Web、非 HTTP 协议)做一些事情。

一些用户要求能够通过 MQTT 协议模拟相同的 REST 命令(避免需要进行两次身份验证并拥有两个不同的协议客户端)。

我见过一些项目,例如 Facebook 的 API通过将部分 HTTP 请求放入使用 JSON 的请求中来“模拟”HTTP(例如:在 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
4

1 回答 1

3

哦非常有趣的问题!

我的第一个想法是向后处理它:所以创建一个假的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 并相应地转置。

不确定这是否真的有帮助。

于 2018-06-12T12:55:18.603 回答