単体テストを書いている 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
正しく動作します (ユーザーが認証されているかどうかを判断するためにコード内でこれを使用する場合)。