测试凤凰控制器,但跳过插头

时间:2018-06-04 10:35:35

标签: elixir phoenix-framework

我目前正在尝试在Phoenix项目中测试控制器。

我有一个相当复杂的身份验证插件(我单独测试)。我不想为所有控制器测试提供有效的凭据。

运行测试时是否有办法跳过某些插头。

我使用bypass_through(conn, MyAppWeb.Router, [])进行了实验,但似乎根本没有达到控制器功能。

2 个答案:

答案 0 :(得分:2)

在测试中绕过身份验证逻辑的一个技巧是直接为连接分配属性。

例如:许多身份验证库期望将current_user分配给连接。可以在规范中伪造,只需分配用户即可,而无需任何实际授权。

因此,如果您的插头检查是否存在特定的conn.assign,则可以在测试中轻松伪造它。

一个控制器测试的示例,该控制器具有一些进行假登录的设置:

setup [:create_user, :login_as_registered_user]

def create_user(_) do
  user = MyApp.insert_user(%{name: "...", email: "..."})
  {:ok, user: user}
end

def login_as_registered_user(%{conn: conn, user: user}) do
  conn = Plug.Conn.assign(:current_user, user)
  {:ok, conn: conn}
end

# ...Lots of tests...

答案 1 :(得分:0)

最简单的方法可能是在您的应用程序代码中执行此操作:

if Mix.env != "test" do
  plug MyAuthenticationPlug
end

然后在测试期间,您的插件将不会被编译。