Elixir 长生不老药
我正在尝试用elixir编写一个宏,它创建一个Phoenix路由器和一个控制器,该控制器有一个动作,该动作应该将消息发送给调用方进程(从测试中调用它) 下面是对宏的调用:Elixir 长生不老药,elixir,phoenix-framework,Elixir,Phoenix Framework,我正在尝试用elixir编写一个宏,它创建一个Phoenix路由器和一个控制器,该控制器有一个动作,该动作应该将消息发送给调用方进程(从测试中调用它) 下面是对宏的调用: start_server self(), "TestService", 8080, "/some_action", fn(conn, _) -> conn |> text("") end 问题是,我从测试中传递的pid在操作中没有被保留。 第#1行打印正确的pid,第#2行打印错误的pid。我很确定我遗漏了一
start_server self(), "TestService", 8080, "/some_action", fn(conn, _) ->
conn |> text("")
end
问题是,我从测试中传递的pid在操作中没有被保留。
第#1行
打印正确的pid,第#2行
打印错误的pid。我很确定我遗漏了一些关于quote
/unquote
,但我找不到我做错了什么
以下是宏定义:
defmacro start_server pid, name, port, path, handler do
controller_name = String.to_atom("#{name}Controller")
router_name = String.to_atom("#{name}Router")
quote do
IO.inspect(unquote(pid)) # 1
ctrl = defmodule unquote(controller_name) do
use Phoenix.Controller
def handle conn, msg do
IO.inspect(unquote(pid)) # 2
send unquote(pid), {:request, unquote(path), unquote(name)}
unquote(handler).(conn, msg)
end
end
IO.inspect ctrl
router = defmodule unquote(router_name) do
use Phoenix.Router
post unquote(path), unquote(controller_name), :handle
end
Application.put_env(:phoenix, unquote(router_name),
port: unquote(port),
debug_errors: true
)
IO.inspect router
{:ok, pid} = unquote(router_name).start()
end
end
错误的pid是什么意思?此外,您不能像那样序列化函数(您不能获得匿名函数并将其注入到模块中,因为函数不是有效的引用表达式)。一开始,由于不同的原因,您试图做的似乎不起作用,但很难提出改进建议,因为不清楚您想要实现什么。@JoséValim我正在尝试运行http服务器,并在每个测试中提供它的单控制器操作行为。关于引用匿名函数,这里是我得到的:iex>quote do:fn(conn,)->conn |>text(“”)end{:fn,[],[],[],[],[[],[[[]:conn,[],[],[],[],[context:Elixir,import:Kernel],[context:Elixir,[],[],[],[],[],[],[]]抱歉,但动态生成控制器+路由器听起来并不是解决这个问题的好办法。首先,它会使您的测试套件变得昂贵,因为每次测试编译一堆模块会很昂贵。其次,它不容易理解,因为宏代码很复杂。最后,控制器是插头,至少在master上是这样,这意味着您可以直接测试它们: