![](/img/trans.png)
[英]Asp .Net Core Unit Test Mock UserManager.CreateAsync and return Identity Result
[英].NET Core 2 Identity CreateAsync Error Catching
嘗試 CreateAsync 用戶時出現錯誤。
var create = await _userManager.CreateAsync(user, model.Password);
我可以在IdentityResult
上訪問一個名為errors
的屬性。 但是我不知道如何訪問它。 知道如何捕捉它以便我可以看到它出錯了嗎?
我已經在下面發布了完整的控制器代碼。 出於某種原因,每當我嘗試使用 var create 執行任何操作時,它都會忽略它。 我什至無法踏入其中。
namespace TechsportiseOnline.Controllers
{
[Produces("application/json")]
[Route("api/[controller]/[action]")]
public class RegistrationController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly IConfiguration _configuration;
private readonly IOptions<JWTSettings> _jwtConfig;
private readonly IEmailSender _emailSender;
public RegistrationController(
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
IConfiguration configuration,
IOptions<JWTSettings> jwtConfig,
IEmailSender emailSender)
{
_userManager = userManager;
_signInManager = signInManager;
_configuration = configuration;
_jwtConfig = jwtConfig;
_emailSender = emailSender;
}
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> Register([FromBody] RegisterModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser
{
UserName = model.Email,
Email = model.Email,
FirstName = model.FirstName,
LastName = model.LastName,
MobileNumber = model.MobileNumber,
Marketing = model.Marketing,
Newsletter = model.Newsletter
};
var result = new CreateUserResult();
var create = await _userManager.CreateAsync(user, model.Password);
if (create.Succeeded == true)
{
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
var callbackUrl = Url.EmailConfirmationLink(user.Id, code.ToString(), Request.Scheme);
await _emailSender.SendEmailConfirmationAsync(model.Email, callbackUrl);
//await _createContact.CreateContactAsync(model.Email, model.FirstName, model.LastName, model.Marketing, model.Newsletter);
var fields = new Dictionary<string, string>();
fields.Add("firstname", model.FirstName);
fields.Add("lastname", model.LastName);
fields.Add("newsletter", model.Newsletter.ToString());
fields.Add("marketing", model.Marketing.ToString());
string publicaccountid = "55ebcc8b-b23f-4843-9dcb-1df08811de65";
var createcontact = ElasticEmailClient.Api.Contact.AddAsync(publicAccountID: publicaccountid, email: model.Email, field: fields);
//await _signInManager.SignInAsync(user, isPersistent: false);
return CreatedAtRoute("CreateAccount", model);
}
else
{
return BadRequest("Could not register account");
}
}
else
{
return BadRequest("The model is invalid");
}
}
}
}
這是我的示例代碼:我使用 MediatR 來(嘗試)分離查詢和命令。
CreateUserByAdminHandler
public class CreateUserByAdminHandler : IAsyncRequestHandler<CreateUserByAdmin, CreateUserResult>
{
private readonly UserManager<AppUser> _userManager;
public CreateUserByAdminHandler(UserManager<AppUser> userManager)
{
_userManager = userManager;
}
public async Task<CreateUserResult> Handle(CreateUserByAdmin command)
{
var result = new CreateUserResult();
try
{
var appUser = new AppUser
{
UserName = command.Username.Trim(),
FirstName = command.FirstName.Trim(),
LastName = command.LastName.Trim(),
Email = command.Email,
PhoneNumber = command.PhoneNumber,
Status = UserStatus.Active
};
var createResult = await _userManager.CreateAsync(appUser, command.Password);
if (!createResult.Succeeded)
{
// IdentityResult has Errors property, which is a list of
// IdentityError. IdentityError has Code and Description
// property. It's up to you to select whichever property
// for the error message.
result.AddErrors(createResult.Errors.Select(ier => ier.Description));
return result;
}
result.NewUser = appUser;
}
catch (Exception ex)
{
result.SetException(ex);
}
return result;
}
}
在if (create.Succeeded == true)上設置斷點並檢查創建對象或添加 else 語句以讀取錯誤。 這是我用來記錄錯誤的代碼。
var result = await _userManager.CreateAsync(newUser, "Password123!");
if (result.Succeeded)
{
//do stuff
}
foreach (var error in result.Errors)
{
_logger.LogWarning("Code: " + error.Code + " " + error.Description);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.