gpt4 book ai didi

c# - Moq usermanager 缺少 IUserEmailStore

转载 作者:太空狗 更新时间:2023-10-30 01:28:53 26 4
gpt4 key购买 nike

我正在测试什么。

这是一个登录到联合网关的身份服务器项目。我不控制此网关,并且遇到问题时没有将正确的声明返回给我,我需要验证用户登录。我希望能够测试我是否可以处理这些错误。

例如,电子邮件声明丢失,否则我无法登录用户。

我创建了一个测试,用于测试电子邮件声明丢失返回错误。(工作正常)

现在我正在尝试测试事物的另一面。如果声明确实存在,它应该返回与返回的声明相匹配的用户。

我们正在测试的方法

public static async Task<(ApplicationUser user, string provider, string providerUserUserName, IEnumerable<Claim> claims, string message)> FindUserFromExternalProvider(AuthenticateResult result, UserManager<ApplicationUser> userManager, ILogger<SegesExternalController> logger)
{
var externalUser = result.Principal;

// try to determine the unique id of the external user (issued by the provider)
var eMailClaim = externalUser.FindFirst(SegesSettingsConstants.SegesEmailClaimName);

if(eMailClaim == null) return (null, null, null, null, $"{SegesSettingsConstants.SegesEmailClaimName} claim not found.");

// remove the user id claim so we don't include it as an extra claim if/when we provision the user
var claims = externalUser.Claims.ToList();
claims.LogSegesClaims(logger);

claims.Remove(eMailClaim);
// Should we remove more claims
var provider = result.Properties.Items["scheme"];
var providerUserUserName = eMailClaim.Value;

var user = await userManager.FindByEmailAsync(providerUserUserName); // Test Breaks here

return (user, provider, providerUserUserName, claims, null);
}

测试

[Fact]
public async void Federated_login_with_email_claim_return_no_error()
{
// Arrange

var principal = new ClaimsPrincipal();
principal.AddIdentity(new ClaimsIdentity(
new Claim[] {
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", "Testbruger til André"),
new Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", @"PROD\Salg43"),
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode", "8200"),
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/locality", "Aarhus N"),
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress", "test@email.com"),
},
"FakeScheme"));
var authenticateResult = AuthenticateResult.Success(new AuthenticationTicket(principal, new AuthenticationProperties() { Items = { { "scheme", "fed" } } }, "FakeScheme"));


var exprectUser = new ApplicationUser()
{
UserName = "test@email.com",
NormalizedUserName = "TEST@EMAIL.COM",
NormalizedEmail = "TEST@EMAIL.COM",
Email = "test@email.com",
Id = 123,
EmailConfirmed = true
};

var mockEmailStore = new Mock<IUserEmailStore<ApplicationUser>>();
var mockQueryableUserStore = new Mock<IQueryableUserStore<ApplicationUser>>();

var mockUserStore = new Mock<IUserStore<ApplicationUser>>();
mockUserStore.Setup(x => x.FindByIdAsync(exprectUser.Id.ToString(), CancellationToken.None)).ReturnsAsync(exprectUser);
var userManager = new UserManager<ApplicationUser>(mockUserStore.Object, null, null, null, null, null, null, null, null);


var logger = new Logger<ExternalController>(new LoggerFactory());

// Act
var (user, provider, providerUserUserName, claims, errorMessage) = await AuthorizationHelpers.FindUserFromExternalProvider(authenticateResult, userManager, logger);

// Assert
user.ShouldNotBeNull();
}

上述问题。

我正在尝试为我的单元测试最小化用户管理器

var exprectUser = new ApplicationUser()
{
UserName = "test@email.com",
NormalizedUserName = "TEST@EMAIL.COM",
NormalizedEmail = "TEST@EMAIL.COM",
Email = "test@email.com",
Id = 123,
EmailConfirmed = true
};

var mockUserStore = new Mock<IUserStore<ApplicationUser>>();
mockUserStore.Setup(x => x.FindByIdAsync(exprectUser.Id.ToString(), CancellationToken.None)).ReturnsAsync(exprectUser);
var userManager = new UserManager<ApplicationUser>(mockUserStore.Object, null, null, null, null, null, null, null, null);

然而,当我正在测试的方法试图找到用户时。

var findUser = await userManager.FindByEmailAsync("test@test.com");

它抛出一个错误

Message: System.NotSupportedException : Store does not implement IUserEmailStore.

如何在我的最小起订量用户管理器中实现 IUserEmailStore?

我的单元测试项目确实包含最新的 EntityFramework 包。

尝试另一种方式。

var founduser = userManager.Users.FirstOrDefault(e => e.Email.Equals("test@test.com", StringComparison.InvariantCultureIgnoreCase));

结果

System.NotSupportedException : Store does not implement IQueryableUserStore.

我想我一定是搞错了。

根据评论更新

好的,我可以最小化 IUserEmailStore,但我不确定我应该用它做什么

var mockEmailStore = new Mock<IUserEmailStore<ApplicationUser>>();

最佳答案

我设法创建了一个完整的最小起订量用户管理器,让我可以搜索电子邮件

 public class MoqUserManager : UserManager<ApplicationUser>
{
public MoqUserManager(IUserStore<ApplicationUser> userStore) : base(userStore,
new Mock<IOptions<IdentityOptions>>().Object,
new Mock<IPasswordHasher<ApplicationUser>>().Object,
new IUserValidator<ApplicationUser>[0],
new IPasswordValidator<ApplicationUser>[0],
new Mock<ILookupNormalizer>().Object,
new Mock<IdentityErrorDescriber>().Object,
new Mock<IServiceProvider>().Object,
new Mock<ILogger<UserManager<ApplicationUser>>>().Object)
{ }

public override Task<ApplicationUser> FindByEmailAsync(string email)
{
return Task.FromResult(new ApplicationUser { Email = email });
}
}

这给了我

var mockUserStore = new Mock<IUserStore<ApplicationUser>>();
mockUserStore.Setup(x => x.FindByIdAsync(exprectUser.Id.ToString(), CancellationToken.None)).ReturnsAsync(exprectUser);
var userManager = new FakeUserManager(mockUserStore.Object);

现在我可以验证是否从我的身份服务器返回了与联合登录用户匹配的正确用户。

关于c# - Moq usermanager 缺少 IUserEmailStore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55610171/

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