我目前正在尝试在Phoenix项目中测试控制器。
我有一个相当复杂的身份验证插件(我单独测试)。我不想为所有控制器测试提供有效的凭据。
运行测试时是否有办法跳过某些插头。
我使用bypass_through(conn, MyAppWeb.Router, [])
进行了实验,但似乎根本没有达到控制器功能。
答案 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
然后在测试期间,您的插件将不会被编译。