Dalam versi sebelumnya Anda dapat mengatur Userlangsung pada pengontrol, yang dibuat untuk beberapa pengujian unit yang sangat mudah.
Jika Anda melihat kode sumber untuk ControllerBase Anda akan melihat bahwa Useritu diekstrak dari HttpContext.
public ClaimsPrincipal User => HttpContext?.User;
dan pengontrol mengakses HttpContextviaControllerContext
public HttpContext HttpContext => ControllerContext.HttpContext;
Anda akan melihat bahwa keduanya adalah properti hanya baca. Kabar baiknya adalah bahwa ControllerContextproperti memungkinkan untuk menetapkan nilainya sehingga akan menjadi jalan Anda.
Jadi targetnya adalah mendapatkan objek itu. Dalam Core HttpContextabstrak 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!