Dans les versions précédentes, vous auriez pu définir User
directement sur le contrôleur, ce qui permettait des tests unitaires très faciles.
Si vous regardez le code source de ControllerBase, vous remarquerez que le User
est extrait de HttpContext
.
public ClaimsPrincipal User => HttpContext?.User;
et le contrôleur accède au HttpContext
viaControllerContext
public HttpContext HttpContext => ControllerContext.HttpContext;
Vous remarquerez que ces deux propriétés sont en lecture seule. La bonne nouvelle est que la ControllerContext
propriété permet de définir sa valeur afin que ce soit votre chemin.
Donc, l'objectif est d'atteindre cet objet. In Core HttpContext
est abstrait, il est donc beaucoup plus facile de se moquer.
En supposant un contrôleur comme
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);
}
}
En utilisant Moq, un test pourrait ressembler à ceci
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")
pour correspondre à l'utilisation du contrôleuruser.Identity.Name
; mais sinon c'est exactement ce que j'essayais de réaliser ... Danke schon!