如何模拟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);