이전 버전에서는 User
컨트롤러에서 직접 설정할 수 있었기 때문에 매우 쉬운 단위 테스트가 가능했습니다.
당신의 소스 코드를 보면 ControllerBase 당신은이 것을 알 User
에서 추출됩니다 HttpContext
.
public ClaimsPrincipal User => HttpContext?.User;
컨트롤러는 HttpContext
비아에 액세스합니다.ControllerContext
public HttpContext HttpContext => ControllerContext.HttpContext;
이 두 가지는 읽기 전용 속성임을 알 수 있습니다. 좋은 소식은 ControllerContext
속성 이 그 가치를 설정할 수 있도록 허용한다는 것입니다.
그래서 목표는 그 물체에 도달하는 것입니다. In Core 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
. 하지만 그렇지 않으면 정확히 내가 달성하려고했던 것입니다 ... Danke schon!