在以前的版本中,你可以有控制器,這對於一些非常簡單的單元測試取得直接設置User
。
如果你看他的源代碼ControllerBase你會注意到User
是從HttpContext
中提取的。
/// <summary>
/// Gets or sets the <see cref="ClaimsPrincipal"/> for user associated with the executing action.
/// </summary>
public ClaimsPrincipal User
{
get
{
return HttpContext?.User;
}
}
和控制器訪問HttpContext
通過ControllerContext
/// <summary>
/// Gets the <see cref="Http.HttpContext"/> for the executing action.
/// </summary>
public HttpContext HttpContext
{
get
{
return 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);
}
//...other code removed for brevity
}
使用起訂量,測試看起來是這樣的
public void Given_User_Index_Should_Return_ViewResult_With_Model() {
//Arrange
var username = "FakeUserName";
var identity = new GenericIdentity(username, "");
var mockPrincipal = new Mock<IPrincipal>();
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() {
//...other code removed for brevity
};
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
}
};
//Act
var viewResult = controller.Index() as ViewResult;
//Assert
Assert.IsNotNull(viewResult);
Assert.IsNotNull(viewResult.Model);
Assert.AreEqual(model, viewResult.Model);
}
在我的情況下,它是'新的聲明(ClaimTypes.Name,「1」)'以匹配控制器使用'user.Identity.Name';但除此之外,這正是我想要達到的目標...... Danke schon! – Felix
經過無數個小時的搜索,這是終於讓我擺脫的帖子。在我的核心2.0項目控制器方法中,我利用了'User.FindFirstValue(ClaimTypes.NameIdentifier);'在我創建的對象上設置了userId,並且因爲principal爲null而失敗。這對我來說是固定的。謝謝你的偉大答案! –