Nelle versioni precedenti avresti potuto impostare User
direttamente sul controller, il che ha reso alcuni test unitari molto semplici.
Se guardi il codice sorgente di ControllerBase noterai che User
viene estratto da HttpContext
.
public ClaimsPrincipal User => HttpContext?.User;
e il controller accede al HttpContext
viaControllerContext
public HttpContext HttpContext => ControllerContext.HttpContext;
Noterai che queste due sono proprietà di sola lettura. La buona notizia è che la ControllerContext
proprietà consente di impostare il suo valore in modo che sia la tua strada.
Quindi l'obiettivo è raggiungere quell'oggetto. In Core HttpContext
è astratto, quindi è molto più facile da deridere.
Supponendo che un controller come
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);
}
}
Utilizzando Moq, un test potrebbe essere simile a questo
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")
per abbinare l'uso del controlleruser.Identity.Name
; ma per il resto è esattamente quello che stavo cercando di ottenere ... Danke schon!