我维护着一个使用Rails作为API的成熟代码库。Rails应用程序还使用MQTT(一种实时,非Web,非HTTP协议(执行一些操作。
一些用户要求能够通过 MQTT 协议模拟相同的 REST 命令(避免了两次身份验证的需要,并且有两个不同的协议客户端(。
我见过一些项目,例如Facebook的API,通过使用JSON将部分HTTP请求放入请求中来"模拟"HTTP(例如:在JSON有效负载上具有"标头"和"方法"属性(。这正是我想做的,但完全在HTTP上下文之外。它将发生在处理 MQTT 消息的后台工作线程中。
是否可以使用 ActionDispatch 和好友来单独模拟控制器调度?
我很难找到有关如何在 RSpec 之外隔离实例化ActionDispatch::Request
对象的文档。
MyController.dispatch("create",
ActionDispatch::Request.new({"???" => "Can't find any docs on this one."}),
ActionDispatch::Response.new("?"))
# => RuntimeError: Missing rack.input
非常有趣的问题!
我的第一个想法是倒退:所以创建一个假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 并相应地转置。
不确定这是否真的有帮助。