亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

測試身份驗證方法

測試身份驗證方法

C#
慕的地8271018 2022-09-04 16:28:00
我目前正在嘗試學習單元測試,并且我已經在 ASP.NET Core中創建了項目,因此我可以在真實示例中學習測試。我想在API控制器中測試身份驗證方法的快樂路徑,因此它將返回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;            }        }但是,單元測試返回的是 BadRequest,而不是按預期返回 OkObjectResult。這意味著該用戶實際上可能是空的,并且它正在拋出一個BadRequest。我應該模擬存儲庫而不是IUserService嗎?
查看完整描述

1 回答

?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

實際上,你做得很好,并且做得很好(真正使用AAA的開發人員太少了,這非??杀?,但請記住,默認情況下Mock返回default(T)值。因此,您的Authorban方法被模擬并返回默認值(User),該默認值為空。只需讓它返回您的存根用戶:


 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()。


查看完整回答
反對 回復 2022-09-04
  • 1 回答
  • 0 關注
  • 131 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號