Используя .NET Core 2.2, я пытаюсь протестировать страницу Razor с помощью Identity Framework, который начинается следующим образом
var user = await _userManager.GetUserAsync(User);
Существует множество онлайн-решений, которые могут быть обобщены этим общим классом: настройка UserManager на макет IUserStore и настройка User на PageContext.
public class SetupContext<T> where T : IdentityUser<Guid>, new()
{
public Mock<IUserRoleStore<T>> MockUserStore { get; private set; }
public UserManager<T> SetupUserManager()
{
MockUserStore = new Mock<IUserStore<T>>().As<IUserRoleStore<T>>();
MockUserStore.Setup(x => x.FindByIdAsync(It.IsAny<string>(), It.IsAny<CancellationToken>())).ReturnsAsync(
(string id, CancellationToken token) => new T()
{
Id = Guid.Parse(id),
UserName = "User name"
});
return new UserManager<T>(MockUserStore.Object, null, null, null, null, null, null, null, null);
}
public PageContext SetupPageContext()
{
var displayName = "User name";
var identity = new GenericIdentity(displayName);
var principle = new ClaimsPrincipal(identity);
var httpContext = new DefaultHttpContext()
{
User = principle
};
var modelState = new ModelStateDictionary();
var actionContext = new ActionContext(httpContext, new RouteData(), new PageActionDescriptor(), modelState);
var modelMetadataProvider = new EmptyModelMetadataProvider();
var viewData = new ViewDataDictionary(modelMetadataProvider, modelState);
var pageContext = new PageContext(actionContext)
{
ViewData = viewData
};
return pageContext;
}
}
Проблема в том, что это не сработает. GetUserAsync вызывает GetUserId, который вызывает
principal.FindFirstValue(Options.ClaimsIdentity.UserIdClaimType)
Это утверждение не настроено, фактически нигде не установлено ни одного идентификатора, поэтому оно не может вернуть ни пользователя, ни идентификатор пользователя. Затем позже я захочу получить доступ к данным базы данных, связанным с UserId, для тестирования.
Я потратил довольно много времени на поиск и не нашел решения. Похоже, я там на 90%, но что еще мне нужно, чтобы правильно настроить тест?
Тест, который я буду запускать, будет настроен так
private async Task<FreeTrialModel> SetupModelAsync()
{
_db = new RemoteHealingTechDbContext(InMemoryDbContext<RemoteHealingTechDbContext>.GetTestDbOptions());
await SeedData.Initialize(_db);
var _setup = new SetupContext<ApplicationUser>();
var userManager = _setup.SetupUserManager();
var pageContext = _setup.SetupPageContext();
return new FreeTrialModel(_db, userManager)
{
PageContext = pageContext
};
}