ASP.NET Core で IPrincipal をモックする 質問する

ASP.NET Core で IPrincipal をモックする 質問する

単体テストを書いている ASP.NET MVC Core アプリケーションがあります。アクション メソッドの 1 つでは、いくつかの機能にユーザー名を使用します。

SettingsViewModel svm = _context.MySettings(User.Identity.Name);

これは明らかに単体テストで失敗します。調べてみたところ、HttpContext をモックするための .NET 4.5 からの提案ばかりでした。もっと良い方法があるはずです。IPrincipal を挿入しようとしましたが、エラーが発生し、(おそらく必死になって) これも試しました。

public IActionResult Index(IPrincipal principal = null) {
    IPrincipal user = principal ?? User;
    SettingsViewModel svm = _context.MySettings(user.Identity.Name);
    return View(svm);
}

しかし、これもエラーをスローしました。ドキュメントでも何も見つかりませんでした...

ベストアンサー1

コントローラーのUser アクセスされるを通ってHttpContextコントローラーの。 後者保存されています以内ControllerContext

ユーザーを設定する最も簡単な方法は、構築されたユーザーで別のHttpContextを割り当てることです。DefaultHttpContextこの目的のために、すべてをモックする必要はありません。次に、コントローラー コンテキスト内でその HttpContext を使用し、それをコントローラー インスタンスに渡します。

var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]
{
    new Claim(ClaimTypes.Name, "example name"),
    new Claim(ClaimTypes.NameIdentifier, "1"),
    new Claim("custom-claim", "example claim value"),
}, "mock"));

var controller = new SomeController(dependencies…);
controller.ControllerContext = new ControllerContext()
{
    HttpContext = new DefaultHttpContext() { User = user }
};

自分で作成する場合ClaimsIdentity明示的に渡すようにしてくださいauthenticationTypeコンストラクタに。これにより、IsAuthenticated正しく動作します (ユーザーが認証されているかどうかを判断するためにコード内でこれを使用する場合)。

おすすめ記事