En versiones anteriores, podría haberlo configurado User
directamente en el controlador, lo que hizo que algunas pruebas unitarias fueran muy fáciles.
Si observa el código fuente de ControllerBase , notará que User
se extrae de HttpContext
.
public ClaimsPrincipal User => HttpContext?.User;
y el controlador accede a la HttpContext
víaControllerContext
public HttpContext HttpContext => ControllerContext.HttpContext;
Notará que estas dos son propiedades de solo lectura. La buena noticia es que la ControllerContext
propiedad permite establecer su valor para que sea su entrada.
Entonces el objetivo es llegar a ese objeto. En Core HttpContext
es abstracto, por lo que es mucho más fácil burlarse.
Asumiendo un controlador como
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);
}
}
Usando Moq, una prueba podría verse así
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")
para hacer coincidir el uso del controlador deuser.Identity.Name
; pero por lo demás es exactamente lo que estaba tratando de lograr ... ¡Danke schon!