ログイン要件プラグは、this example by Thoughtbotに記載されているものとよく似ています。私は、ユーザーがリダイレクトされたときにフラッシュ通知を追加したい。これはブラウザでは動作しますが、単独でテストするときには動作しません。カスタムプラグをユニットテストするときにセッションとフラッシュにアクセスする
プラグ:
# In webs/plugs/require_login.ex
defmodule MyApp.Plugs.RequireLogin do
import Plug.Conn
def init(opts), do: opts
if false # real user authentication omitted
conn
else
conn
|> Phoenix.Controller.put_flash(:error, "Login required.")
|> Phoenix.Controller.redirect(to: "/")
|> halt
end
end
end
このために使用される試験:
defmodule MyApp.Plugs.RequireLoginTest do
use MyApp.ConnCase
test "user is redirected when authentication fails" do
conn = conn |> MyApp.Plugs.RequireLogin.call(%{})
assert Phoenix.Controller.get_flash(conn, :error) == "Login required."
assert redirected_to(conn) == "/"
end
end
Iが得るエラーメッセージがある:
(例外ArgumentError)フラッシュフェッチされていない、fetch_flashを呼び出します/ 2
プラグモジュールでエラーが発生しましたが、そこにput_session
行をコメントアウトすると、エラーがテストファイルに移動します。
セッションストアがlib/my_app/endpoint.ex
に設定されていることを理解していますが、この設定を再利用してプラグをユニットテストできるようにするにはどうすればよいですか?
はここでプラグをルータに引っ掛けられる方法は次のとおりです。
# web/router.ex
pipeline :browser do
# the Phoenix default
end
scope "/", MyApp do
pipe_through [:browser, MyApp.Plugs.RequireLogin]
resource "/protected", MyController, only: [:index]
end
ありがとうございます@amatalai。私のプラグインは、単体テストから実行されたときではなく、ブラウザセッションで問題なく動作しています。私はそれを明確にするために私の質問を更新しました。 – carp
@ carpも私の答えを更新しました – amatalai
あなたの答えは、テストでパイプラインの使用を強制する方法を掘り起こしました。私は 'bypass_through/3'を見つけました - 下の私の答えを見てください。ありがとう! – carp