Тестирование аутентификации методов - PullRequest
0 голосов
/ 11 февраля 2019

В настоящее время я пытаюсь выучить модульные тесты, и я создал проект в ASP.NET Core, поэтому я могу научиться тестировать на реальном примере.Я хочу проверить счастливый путь для метода authenticate в API Controller, чтобы он возвращал OkObjectResult.

То, что у меня есть.

Метод контроллера, который я хотел бы проверить

        [AllowAnonymous]
        [HttpPost("authenticate")]
        public IActionResult Authenticate([FromBody]User userParam)
        {
            var user = _userService.Authenticate(userParam.Nickname, 
            userParam.Password).Result;

            if(user == null)
            {
                return BadRequest(
                  new { message = "Username or password is incorrect " }
                );
            }

            return Ok(user);
        }

Метод аутентификации в классе, который реализует IUserService:

public async Task<User> Authenticate(string nickname, string password)
        {
            var user = _repository.User.GetAllUsersAsync().Result.SingleOrDefault(u => u.Nickname == nickname && u.Password == password);

            if(user == null)
            {
                return null;
            }

            var tokenHandler = new JwtSecurityTokenHandler();
            var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
            var tokenDescription = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new Claim[]
                {
                    new Claim(ClaimTypes.Name, user.UserId.ToString())
                }),
                Expires = DateTime.UtcNow.AddDays(7),
                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
            };

            var token = tokenHandler.CreateToken(tokenDescription);
            user.Token = tokenHandler.WriteToken(token);

            try
            {
                await _repository.User.UpdateUserAsync(user);

                user.Password = null;

                return user;
            }
            catch (Exception e)
            {
                return user;
            }

        }

И мой модульный тест:

        [Fact]
        public void Authenticate_WhenCalled_ReturnsOk()
        {
            //Arrange
            var mockService = new Mock<IUserService>();
            var user = new User()
            {
                UserId = 4,
                IsAdmin = true,
                Token = "12983912803981",
                IsLogged = true,
                MessagesSent = null,
                MessagesReceived = null,
                Nickname = "test3",
                Password = "Str0ngP@ssword123",
                UserChannels = null
            };

            var controller = new UsersController(_repository, _logger, mockService.Object);

            //Act
            var result = controller.Authenticate(user);

            //Assert
            var okResult = result.Should().BeOfType<OkObjectResult>();
        }

Однако модульные тесты возвращают BadRequest, а не OkObjectResult, как предполагалось.Это означает, что, вероятно, пользователь на самом деле имеет значение null и выбрасывает BadRequest.Должен ли я издеваться над хранилищем вместо IUserService?

1 Ответ

0 голосов
/ 11 февраля 2019

На самом деле вы достаточно хороши и делаете все отлично (слишком мало разработчиков на самом деле используют AAA, что очень печально), но помните, что Mock по умолчанию возвращает значение default (T) .Таким образом, ваш метод Authenticate проверяется и возвращает default (Пользователь) , что равно null .Просто заставьте его вернуть своего пользователя-заглушки:

 var mockService = new Mock<IUserService>();
 var user = new User()
        {
            UserId = 4,
            IsAdmin = true,
            Token = "12983912803981",
            IsLogged = true,
            MessagesSent = null,
            MessagesReceived = null,
            Nickname = "test3",
            Password = "Str0ngP@ssword123",
            UserChannels = null
        };
 mockService.Setup(x=> x.Authenticate(It.IsAny(), It.IsAny())).Returns(user);

или более строгая версия, предложенная @ xander :

 mockService.Setup(x=> x.Authenticate("test3", "Str0ngP@ssword123")).Returns(user);

Это также будетубедитесь, что вы действительно используете значения из переданных в User, а не просто вслух возвращаете Ok ().

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