Я пытаюсь просто проверить мой метод Register.cshtml.cs OnGet()
. PageModel требует UserManager<TUser>
и SignInManager<TUser>
. Мне нужно смоделировать метод SignInManager<TUser>.IsSignedIn(ClaimsPrincipal user)
, который требует этих классов. Проблема в том, что конструкторы для этих классов в ASP .NET Core намного сложнее, чем большинство решений, описанных в предыдущих версиях ASP .NET. Единственный конструктор для UserManager
имеет девять обязательных параметров, и я считаю, что SignInManager
требуется семь.
Мне удалось пройти достаточно далеко, чтобы выполнить мой тест, но проверяемый метод не выполняется.
Мой тест:
[Fact]
public void OnGet_UserIsSignedIn_RedirectsToIndex()
{
using (var testContext = new ApplicationDbContext(TestHelper.TestApplicationDbContextOptions()))
{
// Arrange
var mockUserStore = new Mock<IUserStore<AppUser>>();
var userManager = new UserManager<AppUser>(mockUserStore.Object, null, null, null, null, null, null, null, null);
var mockSignInManager = new Mock<SignInManager<AppUser>>(
userManager,
new HttpContextAccessor(),
new Mock<IUserClaimsPrincipalFactory<AppUser>>().Object,
new Mock<IOptions<IdentityOptions>>().Object,
new Mock<ILogger<SignInManager<AppUser>>>().Object,
new Mock<IAuthenticationSchemeProvider>().Object,
new Mock<IUserConfirmation<AppUser>>().Object
);
var claimsPrincipal = new TestPrincipal(new Claim("name", "John Doe"));
var _mockConfig = new Mock<IConfiguration>();
var _mockUserValidator = new UserValidator<AppUser>();
var _mockLogger = new Mock<ILogger<RegisterModel>>();
var _mockEmailSender = new Mock<IEmailSender>();
var registerModel = new RegisterModel(_mockConfig.Object, userManager, mockSignInManager.Object, _mockUserValidator, _mockLogger.Object, _mockEmailSender.Object);
mockSignInManager.Setup(m => m.IsSignedIn(claimsPrincipal)).Returns(true);
var expected = new RedirectToPageResult("/Index");
// Act
var result = registerModel.OnGet();
//Assert
Assert.Equal(expected, result);
}
}
OnGet
метод:
public IActionResult OnGet(string returnUrl = null)
{
// The test is supposed to result in the code inside of this IF executing
// but it continues on and fails at CreateGateway() because it is missing
// dependencies for that method.
if (_signInManager.IsSignedIn(User))
return new RedirectToPageResult("/Index");
ReturnUrl = returnUrl;
// Create gateway
Gateway = CreateGateway();
// Load clientToken
ClientToken = Gateway.ClientToken.Generate();
return Page();
}
Ошибка:
Error Message:
System.NullReferenceException : Object reference not set to an instance of an object.
Stack Trace:
at Project.Areas.Identity.Pages.Account.RegisterModel.CreateGateway() in ... line 150
Конструктор RegisterModel:
public RegisterModel(
IConfiguration config,
UserManager<AppUser> userManager,
SignInManager<AppUser> signInManager,
UserValidator<AppUser> userValidator,
ILogger<RegisterModel> logger,
IEmailSender emailSender)
{
_config = config;
_userManager = userManager;
_signInManager = signInManager;
_userValidator = userValidator;
_logger = logger;
_emailSender = emailSender;
}
Мало того, что мой тест кажется чрезмерно сложным, но он не запускает фиктивный метод IsSignedIn () и завершается ошибкой в более поздней строке из-за отсутствия зависимостей для метода CreateGateway()
.
Просто: Как организовать тест для обработчика PageModel, требующего UserManager<TUser>
и SignInManager<TUser>
для ASP .NET Core 3.0 или более поздней версии ?