Как выполнить модульное тестирование обработчиков ASP .NET Core 3.0+ Razor Page, для которых требуются UserManager <TUser>и SignInManager <TUser>? - PullRequest
0 голосов
/ 20 ноября 2019

Я пытаюсь просто проверить мой метод 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 или более поздней версии ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...