如何模拟UserManager和RoleManager进行unit testing

我已经模拟了抽象类来测试类的具体方法如下。

var mock = new Mock(); mock.CallBase = true; var ta = mock.Object; ta.ControllerContext = new HttpControllerContext { Request = new HttpRequestMessage() }; var owinMock = new Mock(); owinMock.Setup(o => o.Authentication.User).Returns(new ClaimsPrincipal()); owinMock.Setup(o => o.Request).Returns(new Mock().Object); owinMock.Setup(o => o.Response).Returns(new Mock().Object); owinMock.Setup(o => o.Environment).Returns(new Dictionary { { "key1", 123 } }); var traceMock = new Mock(); owinMock.Setup(o => o.TraceOutput).Returns(traceMock.Object); ta.Request.SetOwinContext(owinMock.Object); var result = await ta.ActivateDeactive("test@user.com", true); 

问题:我的抽象类使用Entity Framework 6 and Asp.Net Identity UserManager and RoleManager ,如下所示

 public TestUserManager UserService { get { return _userService ?? Request.GetOwinContext().GetUserManager(); } private set { _userService = value; } } public TestRoleManager RoleService { get { return _roleService ?? Request.GetOwinContext().Get(); } private set { _roleService = value; } } 

我如何在上面的模拟代码中模拟TestUserManager and TestRoleManager

我尝试了以下方法,但无法通过controllerContext将其连接起来。

 var userStore = new Mock<IUserStore>(); var userManager = new TestUserManager(userStore.Object); 

回答Aleksey L.的问题。

这就是TestUserManager如何派生UserManaer并实现的。

 public class TestUserManager : UserManager { public TestUserManager(IUserStore store) : base(store) { } public static TestUserManager Create(IdentityFactoryOptions options, IOwinContext context) { TestUserManager manager = new TestUserManager(new UserStore(context.Get())); setValidationRules(manager); IDataProtectionProvider dataProtectionProvider = options.DataProtectionProvider; if (dataProtectionProvider == null) dataProtectionProvider = new DpapiDataProtectionProvider(); manager.UserTokenProvider = new DataProtectorTokenProvider(dataProtectionProvider.Create("ASP.NET Identity")) { TokenLifespan = TimeSpan.FromDays(expiryTime) }; return manager; } public static TestUserManager CreateLocal(AuthContext context) { TestUserManager manager = new TestUserManager(new UserStore(context)); setValidationRules(manager); IDataProtectionProvider dataProtectionProvider = new DpapiDataProtectionProvider(); manager.UserTokenProvider = new DataProtectorTokenProvider(dataProtectionProvider.Create("ASP.NET Identity")); return manager; } private static void setValidationRules(ApplicationUserManager manager) { manager.UserValidator = new UserValidator(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; manager.PasswordValidator = new ApplicationPasswordValidator { RequiredLength = 30, MaximumCharacters = 30, RequireNonLetterOrDigit = false, RequireDigit = true, RequireLowercase = false, RequireUppercase = false }; } } 

控制器代码

 public async Task ActivateDeactive(string studentId, bool active) { IdentityResult result; _accountService = new AccountMgtService(UserService, RoleService); result = await _accountService.ActiveDeactiveUser(userId, active); } 

不确定为什么要实现TestUserManager而不仅仅是模拟它。 Lat说我们在控制器中有以下代码:

 var owinContext = Request.GetOwinContext(); var userManager = owinContext.GetUserManager(); var applicationUser = userManager.FindById("testId"); 

您可以这样注入模拟用户存储:

 var owinMock = new Mock(); var userStoreMock = new Mock>(); userStoreMock.Setup(s => s.FindByIdAsync("testId")).ReturnsAsync(new ApplicationUser { Id = "testId", Email = "test@email.com" }); var applicationUserManager = new ApplicationUserManager(userStoreMock.Object); owinMock.Setup(o => o.Get(It.IsAny())).Returns(applicationUserManager); ta.Request.SetOwinContext(owinMock.Object);