0

我正在使用 Nunit 和 moq 模拟框架实现单元测试。在测试时,我成功地模拟了 Usermanager 和身份,但无法返回正确的值和数据类型。

模拟用户管理器

var users = new List<MstUser>
{
new MstUser { Id=new Guid("b35ec046-423e-4ee4-a057-fcb1fe182086") , 
            Email="niteshkmodi@gmail.com", 
            UserName = "niteshkmodi@gmail.com" }
}.AsQueryable();
var userManager = new Mock<ApplicationUserManager>();
userManager.Setup(x => x.Users).Returns(users);

// Initialize controller constructor
var controller = new HomeController(userManager.Object, adminBl);

// Calling Index Method to test
ViewResult result = await controller.Index(model, RedirectToAction) as ViewResult;

通过使用此代码,我能够模拟 UserManager 但在控制器身份引用中进行测试时返回 null

var identity = await UserManager.CreateIdentityAsync(adminUser, DefaultAuthenticationTypes.ApplicationCookie);

我无法添加声明,这会产生参考错误。

identity.AddClaim(new Claim(IdentityClaimConst.FullName, adminUser.Name == null ? "" : adminUser.Name));

模拟身份

var controllerContext = new Mock<ControllerContext>();
var principal = new Moq.Mock<IPrincipal>();
principal.SetupGet(x => x.Identity.Name).Returns(userName);
controllerContext.SetupGet(x => x.HttpContext.User).Returns(principal.Object);
var controller = new HomeController(adminBl);
controller.ControllerContext = controllerContext.Object;
JsonResult result = controller.MyProfile(null, null) as JsonResult;

从这段代码中,我成功地模拟了 Identity 但无法访问 User.Identity.GetUserId() 的值,这会导致转换错误

无法将类型为“Castle.Proxies.ObjectProxy”的对象转换为类型“System.Security.Claims.ClaimsIdentity”。

4

0 回答 0