ASP. NET MVC 5 - служба модульного тестирования, использующая только идентификационные данные - PullRequest
1 голос
/ 27 апреля 2020

У меня есть этот класс, который, на самом деле, выполняет только операции над ASP. NET Идентичность.

 public class AuthenticationService : IAuthenticationService
    {
        private readonly ApplicationSignInManager _signInManager;
        private readonly ApplicationUserManager _userManager;
        private readonly IAuthenticationManager _authManager;
        private readonly HttpContextBase _context;

        public AuthenticationService(
            ApplicationSignInManager signInManager, 
            ApplicationUserManager userManager, 
            IAuthenticationManager authManager,
            HttpContextBase context)
        {
            _signInManager = signInManager;
            _userManager = userManager;
            _authManager = authManager;
            _context = context;
        }

        public async Task<SignInStatus> SignIn(string email, string password)
        {
            var result = await _signInManager.PasswordSignInAsync(email, password, true, shouldLockout: false);
            return result;
        }

        public async Task<IdentityResult> Register(string email, string password)
        {
            var user = new AppUser
            {
                UserName = email,
                Email = email,
            };

            var result = await _userManager.CreateAsync(user, password);

            return result;
        }

        public void SignOut()
        {
            _authManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
        }

        public async Task<IdentityResult> ForgotPassword(string email, string newPassword)
        {
            var user = await _userManager.FindByEmailAsync(email);
            string resetToken = await _userManager.GeneratePasswordResetTokenAsync(user.Id);
            var result = await _userManager.ResetPasswordAsync(user.Id, resetToken, newPassword);

            return result;
        }

        public async Task<AppUser> GetUserByEmail(string email)
        {
            var user = await _userManager.FindByEmailAsync(email);
            return user;
        }

        public string GetLoggedInUserId()
        {
            if(_context.User.Identity.IsAuthenticated)
            {
                return _context.User.Identity.GetUserId();
            }
            return string.Empty;
        }
    }

Я не знаю, внедряю ли я правильные зависимости. Но мой вопрос:

В таком классе, как этот, какой смысл проводить модульное тестирование? Поскольку большинство методов вызывают методы, относящиеся к Identity, и возвращают только результат.

Единственный тест, который кажется правильным, - это то, что происходит, когда я пытаюсь получить идентификатор пользователя, если ни один пользователь не аутентифицирован .

1 Ответ

1 голос
/ 28 апреля 2020

Практически в любом классе вы можете протестировать, предполагая, что это модульное тестирование одной тестируемой сущности, и все внутренние зависимости (например, ApplicationUserManager или IAuthenticationManager) проверяются:

  1. Все внутренние службы вызываются точное число раз
  2. Тестируемая сущность не изменяет аргументы, переданные в методе, и правильно передает их в вызовы внутренних служб (например, ApplicationUserManager или IAuthenticationManager)

Так, например, вы можете проверить в SignIn, что _signInManager.PasswordSignInAsync вызывается ровно один раз, а аргументы для email и password - такие же, как они были переданы в SignIn; для третьего безымянного аргумента и shouldLockout - они соответствуют бизнес-логике c - истина и ложь.

ForgotPassword сложнее: у вас есть данные, переданные из _userManager.FindByEmailAsync в _userManager.GeneratePasswordResetTokenAsync, а затем на _userManager.ResetPasswordAsync.
В этом случае вам не нужно проверять правильность результатов этих трех вызовов, поскольку такая вещь должна быть проверена в тестах на _userManager, но вам нужно будет проверить эти вызовы для всех этих Услуги выполняются точное количество раз.

...