.net core mvc Mocking Identity and claims 并测试用户是否有声明
.net core mvc Mocking Identity and claims and test if user has claim
我正在尝试对我的控制器逻辑进行单元测试,它是一个(.Net core 2 mvc 应用程序)我有一个控制器,如果用户有特定的声明,它 return 是一个项目的详细信息,我想要使用 XUnit 进行单元测试。
这是控制器:
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var controlException = await _context.ControlException.FirstOrDefaultAsync(m => m.Id == id);
if (controlException == null)
{
return NotFound();
}
if (User.HasClaim("control Claim", "control Claim"))
{
return View(controlException);
}
else
{
return RedirectToAction("AccessDenied", "Account");
}
}
我的单元测试代码是:(GetContextWithData()
return InMemory test Database)
[Fact]
public async Task VerifyDetailsViewType()
{
using (var context = GetContextWithData())
using (var _controller = new ControlExceptionsController(context))
{
var userStore = new Mock<IUserStore<ApplicationUser>>();
var userManager = new UserManager<ApplicationUser>(
userStore.Object, null, null, null, null, null, null, null, null);
var cp = new Mock<ClaimsPrincipal>();
cp.Setup(m => m.HasClaim(It.IsAny<string>(), It.IsAny<string>()))
.Returns(true);
cp.Setup(m => m.Identity).Returns(identityMock.Object);
_controller.ControllerContext.HttpContext = new DefaultHttpContext();
_controller.ControllerContext.HttpContext.Request.Headers["Referer"] = "http://www.test.nl";
var result = await _controller.Details(888);
Assert.IsType<ViewResult>(result);
}
}
我的测试失败了,因为结果是“RedirectToAction
”而不是“ViewResult
”。
我知道因为用户没有声明,所以问题是我如何为用户分配声明,换句话说我如何模拟 Identity
并声明和管理它。
您需要将 principal 分配给 controller 以允许代码根据需要执行到完成。
您在测试中模拟了主体但未将其分配给控制器。
_controller.ControllerContext.HttpContext.User = cp.Object;
我正在尝试对我的控制器逻辑进行单元测试,它是一个(.Net core 2 mvc 应用程序)我有一个控制器,如果用户有特定的声明,它 return 是一个项目的详细信息,我想要使用 XUnit 进行单元测试。
这是控制器:
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var controlException = await _context.ControlException.FirstOrDefaultAsync(m => m.Id == id);
if (controlException == null)
{
return NotFound();
}
if (User.HasClaim("control Claim", "control Claim"))
{
return View(controlException);
}
else
{
return RedirectToAction("AccessDenied", "Account");
}
}
我的单元测试代码是:(GetContextWithData()
return InMemory test Database)
[Fact]
public async Task VerifyDetailsViewType()
{
using (var context = GetContextWithData())
using (var _controller = new ControlExceptionsController(context))
{
var userStore = new Mock<IUserStore<ApplicationUser>>();
var userManager = new UserManager<ApplicationUser>(
userStore.Object, null, null, null, null, null, null, null, null);
var cp = new Mock<ClaimsPrincipal>();
cp.Setup(m => m.HasClaim(It.IsAny<string>(), It.IsAny<string>()))
.Returns(true);
cp.Setup(m => m.Identity).Returns(identityMock.Object);
_controller.ControllerContext.HttpContext = new DefaultHttpContext();
_controller.ControllerContext.HttpContext.Request.Headers["Referer"] = "http://www.test.nl";
var result = await _controller.Details(888);
Assert.IsType<ViewResult>(result);
}
}
我的测试失败了,因为结果是“RedirectToAction
”而不是“ViewResult
”。
我知道因为用户没有声明,所以问题是我如何为用户分配声明,换句话说我如何模拟 Identity
并声明和管理它。
您需要将 principal 分配给 controller 以允许代码根据需要执行到完成。
您在测试中模拟了主体但未将其分配给控制器。
_controller.ControllerContext.HttpContext.User = cp.Object;