В предыдущих версиях вы могли установить User непосредственно на контроллере, что упростило выполнение некоторых модульных тестов.
Если вы посмотрите исходный код ControllerBase, вы заметите, что Userфайл извлечен из HttpContext.
public ClaimsPrincipal User => HttpContext?.User;
и контроллер получает доступ к переходному HttpContextотверстиюControllerContext
public HttpContext HttpContext => ControllerContext.HttpContext;
Вы заметите, что эти два свойства доступны только для чтения. Хорошая новость заключается в том, что ControllerContextсвойство позволяет установить его значение, чтобы оно было вашим путем.
Итак, цель - добраться до этого объекта. In Core 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);
}
}
Используя Moq, тест мог бы выглядеть так
public void Given_User_Index_Should_Return_ViewResult_With_Model() {
var username = "FakeUserName";
var identity = new GenericIdentity(username, "");
var mockPrincipal = new Mock<ClaimsPrincipal>();
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() {
};
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
}
};
var viewResult = controller.Index() as ViewResult;
Assert.IsNotNull(viewResult);
Assert.IsNotNull(viewResult.Model);
Assert.AreEqual(model, viewResult.Model);
}
new Claim(ClaimTypes.Name, "1")было соответствовать использованию контроллераuser.Identity.Name; но в остальном это именно то, чего я пытался достичь ... Danke schon!