如何从Module访问父导入的函数

时间:2017-03-24 02:05:28

标签: testing elixir metaprogramming

我正在尝试创建一个测试助手来测试使用Maru Framework的应用。这是我想要实现的简化版本:

git commit

问题在于git commitgit commit功能。 defmodule App.ExtendedMaru do @moduledoc false defmacro __using__(opts) do quote do use Maru.Test, unquote(opts) end end def post_body(url, body) do build_conn() |> Plug.Conn.put_req_header("content-type", "application/json") |> put_body_or_params(Poison.encode! body) |> post(url) end end 中定义了build_conn/0,因此可以在此模块中与post/2联系。

但是,build_conn/0是一个私人函数defined inside the __using__ macro for Maru.Test。因此,它存在于使用此模块的模块中,但Maru.Test无法使用它。我不能只在import Maru.Test这里,因为我需要通过选择而没有办法这样做。

是否可以访问应该在包含此功能的模块中定义的post/2函数?

编辑:代码如何结束:

post_body/2

1 个答案:

答案 0 :(得分:0)

你的问题来自两个不同的事情:

  • post_body方法是私有的,因此您无法在Module之外调用它。

  • post_body方法不在__using__宏中,因此use的任何其他模块都无法使用它。

有两个简单的解决方案:

  • post_body方法移到__using__宏内。执行此操作后,use的所有模块都可以调用post_body,但原始模块除外。

  • (或)post_body方法公开,并在__using__内调用defdelegate。通过这种方式,您可以在包括原始模块在内的所有模块中调用它。