Dalam versi sebelumnya Anda dapat mengatur User
langsung pada pengontrol, yang dibuat untuk beberapa pengujian unit yang sangat mudah.
Jika Anda melihat kode sumber untuk ControllerBase Anda akan melihat bahwa User
itu diekstrak dari HttpContext
.
public ClaimsPrincipal User => HttpContext?.User;
dan pengontrol mengakses HttpContext
viaControllerContext
public HttpContext HttpContext => ControllerContext.HttpContext;
Anda akan melihat bahwa keduanya adalah properti hanya baca. Kabar baiknya adalah bahwa ControllerContext
properti memungkinkan untuk menetapkan nilainya sehingga akan menjadi jalan Anda.
Jadi targetnya adalah mendapatkan objek itu. Dalam Core HttpContext
abstrak sehingga lebih mudah untuk diolok-olok.
Dengan asumsi pengontrol suka
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);
}
}
Menggunakan Moq, tes bisa terlihat seperti ini
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")
untuk mencocokkan penggunaan pengontroluser.Identity.Name
; tapi selain itu, itulah yang saya coba capai ... Danke schon!