पिछले संस्करणों में आप User
सीधे नियंत्रक पर सेट कर सकते थे , जो कुछ बहुत आसान इकाई परीक्षणों के लिए बनाया गया था।
यदि आप कंट्रोलरबेस के सोर्स कोड को देखते हैं, तो आप देखेंगे कि इससे User
निकाला गया है HttpContext
।
public ClaimsPrincipal User => HttpContext?.User;
और नियंत्रक के HttpContext
माध्यम से पहुँचता हैControllerContext
public HttpContext HttpContext => ControllerContext.HttpContext;
आप देखेंगे कि इन दोनों को केवल गुण पढ़ा जाता है। अच्छी खबर यह है कि ControllerContext
संपत्ति इसकी कीमत निर्धारित करने की अनुमति देती है ताकि आपका रास्ता इसमें हो।
तो लक्ष्य उस वस्तु को प्राप्त करना है। कोर HttpContext
में अमूर्त है, इसलिए इसे मॉक करना बहुत आसान है।
जैसे एक नियंत्रक मान
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);
}
}
Moq का उपयोग करना, एक परीक्षण इस तरह दिख सकता है
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")
नियंत्रक उपयोग से मेल खाना थाuser.Identity.Name
; लेकिन अन्यथा यह वास्तव में मैं क्या हासिल करने की कोशिश कर रहा था ... डेंके शॉन!