Unit testing 在对自定义插头进行单元测试时访问会话和闪存

Unit testing 在对自定义插头进行单元测试时访问会话和闪存,unit-testing,session,phoenix-framework,flash-message,Unit Testing,Session,Phoenix Framework,Flash Message,我有一个登录需求插件,它与中描述的插件非常相似。我想在重定向用户时添加一个flash通知。它在浏览器中工作,但在单独测试时不起作用 插头: #在web/plugs/require_login.ex中 defmodule MyApp.Plugs.RequireLogin do 进口插头 def初始化(选项),do:opts 如果为false#则忽略真实用户身份验证 康涅狄格州 其他的 康涅狄格州 |>Phoenix.Controller.put_flash(:错误,“需要登录”) |>Phoeni

我有一个登录需求插件,它与中描述的插件非常相似。我想在重定向用户时添加一个flash通知。它在浏览器中工作,但在单独测试时不起作用

插头:

#在web/plugs/require_login.ex中
defmodule MyApp.Plugs.RequireLogin do
进口插头
def初始化(选项),do:opts
如果为false#则忽略真实用户身份验证
康涅狄格州
其他的
康涅狄格州
|>Phoenix.Controller.put_flash(:错误,“需要登录”)
|>Phoenix.Controller.redirect(到“/”)
|>停止
结束
结束
结束
用于此目的的测试:

defmodule MyApp.Plugs.RequireLoginTest do
使用MyApp.ConnCase
测试“身份验证失败时用户被重定向”是否执行
conn=conn |>MyApp.Plugs.RequireLogin.call(%{})
断言Phoenix.Controller.get_flash(conn,:error)=“需要登录。”
断言已重定向到(连接)=“/”
结束
结束
我收到的错误消息是:

(ArgumentError)未获取闪存,请调用fetch\u flash/2

错误发生在plug模块中,但是如果我注释掉那里的
put\u session
行,错误会移动到我的测试文件中

我知道会话存储是在
lib/my_app/endpoint.ex
中配置的,但是如何重新使用此配置以便可以对插件进行单元测试

以下是插头如何连接到路由器:

#web/router.ex
管道:浏览器做什么
#凤凰城违约
结束
范围“/”,MyApp do
管道通过[:浏览器,MyApp.Plugs.RequireLogin]
资源“/protected”,MyController,仅限:[:索引]
结束
编辑
我想到的第一件事是你在测试中缺少了param

您的conn可能是在您的conn案例中的某个地方生成的:

setup tags do
  ...

  {:ok, conn: Phoenix.ConnTest.build_conn()}
end
您的测试应该如下所示:

test "user is redirected when authentication fails", %{conn: conn} do
能够使用这个控制器



第二件事是您的测试中没有请求(get/post等),并且您的conn可能没有通过
:浏览器
管道。

编辑
我想到的第一件事是你在测试中缺少了param

您的conn可能是在您的conn案例中的某个地方生成的:

setup tags do
  ...

  {:ok, conn: Phoenix.ConnTest.build_conn()}
end
您的测试应该如下所示:

test "user is redirected when authentication fails", %{conn: conn} do
能够使用这个控制器




第二件事是您的测试中没有请求(get/post等),并且您的conn可能没有通过
:browser
管道。

我可以使用。我没有使用Phoenix.ConnTest.get/3等“激发”请求,导致未调用plug管道。我一添加
get/3
,flash散列就可用了

defmodule MyApp.Plugs.RequireLoginTest do
使用MyApp.ConnCase
测试“身份验证失败时用户被重定向”,%%{conn:conn}do
连接
|>带管道
|>MyApp.Plugs.RequireLogin.call(%{})
断言Phoenix.Controller.get_flash(conn,:error)=“需要登录。”
断言已重定向到(连接)=“/”
结束
带管道(连接)do的除雾器
康涅狄格州
|>绕过(MyApp.Router,[:browser])
|>获取(“/protecteduri”)#任何uri,忽略路由器规则
结束
结束

我能用计算机解决这个问题。我没有使用Phoenix.ConnTest.get/3等“激发”请求,导致未调用plug管道。我一添加
get/3
,flash散列就可用了

defmodule MyApp.Plugs.RequireLoginTest do
使用MyApp.ConnCase
测试“身份验证失败时用户被重定向”,%%{conn:conn}do
连接
|>带管道
|>MyApp.Plugs.RequireLogin.call(%{})
断言Phoenix.Controller.get_flash(conn,:error)=“需要登录。”
断言已重定向到(连接)=“/”
结束
带管道(连接)do的除雾器
康涅狄格州
|>绕过(MyApp.Router,[:browser])
|>获取(“/protecteduri”)#任何uri,忽略路由器规则
结束
结束

谢谢@amatalai。我的插件在浏览器会话中运行正常,只是在单元测试中运行时不行。我更新了我的问题来澄清这一点。你的回答让我明白了如何在测试中强制使用管道。我发现
绕过了/3
——请参见下面的答案。谢谢谢谢你@amatalai。我的插件在浏览器会话中运行正常,只是在单元测试中运行时不行。我更新了我的问题来澄清这一点。你的回答让我明白了如何在测试中强制使用管道。我发现
绕过了/3
——请参见下面的答案。谢谢