。
ソースコードControllerBaseを見ると、User
がHttpContext
から抽出されています。
/// <summary>
/// Gets or sets the <see cref="ClaimsPrincipal"/> for user associated with the executing action.
/// </summary>
public ClaimsPrincipal User
{
get
{
return HttpContext?.User;
}
}
、コントローラはあなたがこれらの二つのプロパティのみを読み込むされていることがわかりますControllerContext
/// <summary>
/// Gets the <see cref="Http.HttpContext"/> for the executing action.
/// </summary>
public HttpContext HttpContext
{
get
{
return ControllerContext.HttpContext;
}
}
経由HttpContext
にアクセスします。良いことは、ControllerContext
プロパティで値を設定できるようにすることです。
ターゲットはそのオブジェクトを取得することです。コアではHttpContext
は抽象的なので、模擬する方がはるかに簡単です。
部品番号を使用し
public class MyController : Controller {
IMyContext _context;
public MyController(IMyContext context) {
_context = context;
}
public IActionResult Index() {
SettingsViewModel svm = _context.MySettings(User.Identity.Name);
return View(svm);
}
//...other code removed for brevity
}
ようなコントローラを仮定すると、テストはこの
public void Given_User_Index_Should_Return_ViewResult_With_Model() {
//Arrange
var username = "FakeUserName";
var identity = new GenericIdentity(username, "");
var mockPrincipal = new Mock<IPrincipal>();
mockPrincipal.Setup(x => x.Identity).Returns(identity);
mockPrincipal.Setup(x => x.IsInRole(It.IsAny<string>())).Returns(true);
var mockHttpContext = new Mock<HttpContext>();
mockHttpContext.Setup(m => m.User).Returns(mockPrincipal.Object);
var model = new SettingsViewModel() {
//...other code removed for brevity
};
var mockContext = new Mock<IMyContext>();
mockContext.Setup(m => m.MySettings(username)).Returns(model);
var controller = new MyController(mockContext.Object) {
ControllerContext = new ControllerContext {
HttpContext = mockHttpContext.Object
}
};
//Act
var viewResult = controller.Index() as ViewResult;
//Assert
Assert.IsNotNull(viewResult);
Assert.IsNotNull(viewResult.Model);
Assert.AreEqual(model, viewResult.Model);
}
私の場合、 'user.Identity.Name'のコントローラの使用に合うのは' claim(ClaimTypes.Name、 "1") 'です。それ以外は、私が達成しようとしていたものです... Danke schon! – Felix
数え切れないほどの時間を捜した後、これが最終的に私を去らせたポストでした。私のコア2.0プロジェクトコントローラのメソッドでは、私が作成していたオブジェクトにuserIdを設定するために 'User.FindFirstValue(ClaimTypes.NameIdentifier);'を利用していましたが、プリンシパルがnullだったので失敗していました。これは私のために修正されました。素晴らしい答えをありがとう! –