gpt4 book ai didi

c# - 我如何模拟 UserManager 和 RoleManager 进行单元测试

转载 作者:太空狗 更新时间:2023-10-29 18:34:44 25 4
gpt4 key购买 nike

我模拟了抽象类来测试类的具体方法,如下所示。

var mock = new Mock<BaseTestController>();
mock.CallBase = true;
var ta = mock.Object;

ta.ControllerContext = new HttpControllerContext { Request = new HttpRequestMessage() };
var owinMock = new Mock<IOwinContext>();
owinMock.Setup(o => o.Authentication.User).Returns(new ClaimsPrincipal());
owinMock.Setup(o => o.Request).Returns(new Mock<OwinRequest>().Object);
owinMock.Setup(o => o.Response).Returns(new Mock<OwinResponse>().Object);
owinMock.Setup(o => o.Environment).Returns(new Dictionary<string, object> { { "key1", 123 } });
var traceMock = new Mock<TextWriter>();
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 和 Asp.Net Identity UserManager 和 RoleManager 如下

public TestUserManager UserService
{
get
{
return _userService ?? Request.GetOwinContext().GetUserManager<TestUserManager>();
}

private set
{
_userService = value;
}
}

public TestRoleManager RoleService
{
get
{
return _roleService ?? Request.GetOwinContext().Get<TestRoleManager>();
}

private set
{
_roleService = value;
}
}

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

我尝试了以下方式,但无法找到将它与 controllerContext Hook 的方法。

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

Answer to question asked below by Aleksey L.

这就是 TestUserManager 派生 UserManaer 并实现的方式。

public class TestUserManager : UserManager<TestUser>
{
public TestUserManager(IUserStore<TestUser> store)
: base(store)
{
}
public static TestUserManager Create(IdentityFactoryOptions<TestUserManager> options, IOwinContext context)
{
TestUserManager manager = new TestUserManager(new UserStore<TestUser>(context.Get<AuthContext>()));
setValidationRules(manager);

IDataProtectionProvider dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider == null)
dataProtectionProvider = new DpapiDataProtectionProvider();
manager.UserTokenProvider = new DataProtectorTokenProvider<TestUser>(dataProtectionProvider.Create("ASP.NET Identity")) { TokenLifespan = TimeSpan.FromDays(expiryTime) };

return manager;
}

public static TestUserManager CreateLocal(AuthContext context)
{
TestUserManager manager = new TestUserManager(new UserStore<TestUser>(context));
setValidationRules(manager);

IDataProtectionProvider dataProtectionProvider = new DpapiDataProtectionProvider();
manager.UserTokenProvider = new DataProtectorTokenProvider<TestUser>(dataProtectionProvider.Create("ASP.NET Identity"));

return manager;
}

private static void setValidationRules(ApplicationUserManager manager)
{
manager.UserValidator = new UserValidator<TestUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};

manager.PasswordValidator = new ApplicationPasswordValidator
{
RequiredLength = 30,
MaximumCharacters = 30,
RequireNonLetterOrDigit = false,
RequireDigit = true,
RequireLowercase = false,
RequireUppercase = false
};
}
}

Controller 代码

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

}

最佳答案

不确定您为什么要实现 TestUserManager 而不仅仅是模拟它。 Lat 假设我们在 Controller 中有以下代码:

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

您可以通过这种方式注入(inject)模拟用户存储:

var owinMock = new Mock<IOwinContext>();

var userStoreMock = new Mock<IUserStore<ApplicationUser>>();
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<ApplicationUserManager>(It.IsAny<string>())).Returns(applicationUserManager);

ta.Request.SetOwinContext(owinMock.Object);

关于c# - 我如何模拟 UserManager 和 RoleManager 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38628372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com