Trong các phiên bản trước, bạn có thể đặt User
trực tiếp trên bộ điều khiển, điều này giúp thực hiện một số bài kiểm tra đơn vị rất dễ dàng.
Nếu bạn nhìn vào mã nguồn của ControllerBase, bạn sẽ nhận thấy rằng nó User
được trích xuất từ HttpContext
.
public ClaimsPrincipal User => HttpContext?.User;
và bộ điều khiển truy cập HttpContext
thông quaControllerContext
public HttpContext HttpContext => ControllerContext.HttpContext;
Bạn sẽ nhận thấy rằng hai thuộc tính chỉ đọc. Tin tốt là thuộc ControllerContext
tính cho phép thiết lập giá trị của nó để đó sẽ là cách của bạn.
Vì vậy, mục tiêu là để có được đối tượng đó. Trong Core HttpContext
là trừu tượng nên sẽ dễ mô phỏng hơn rất nhiều.
Giả sử một bộ điều khiển như
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);
}
}
Sử dụng Moq, một bài kiểm tra có thể trông như thế này
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")
phù hợp với việc sử dụng bộ điều khiển củauser.Identity.Name
; nhưng nếu không thì đó chính xác là những gì tôi đang cố gắng đạt được ... Danke schon!