gpt4 book ai didi

c# - 如何编写 Web Api 单元测试,我应该从 UserManager 获取信息

转载 作者:行者123 更新时间:2023-11-30 14:53:56 26 4
gpt4 key购买 nike

我已经搜索了 stackoverflow 并用谷歌搜索了四个小时,但仍然没有找到解决我的“微不足道”问题的任何方法。

比如我要测试这个web api controller

public IHttpActionResult GetFavorites()
{
var userApplication = UserManager.FindById(User.Identity.GetUserId());
var user = db.Users.FirstOrDefault(u => u.Username == userApplication.UserName);
if (user == null)
return Unauthorized();

return Ok(db.Favorites.Where(fav => fav.UserID == user.UserID));
}

我尝试为我的 Controller 模拟上下文,还尝试更改 Thread.CurrentPrincipal。

有些人可以帮助我解决这个问题,我做错了什么?

最佳答案

上面的 Controller 在当前状态下很难进行单元测试。您必须模拟 UserManagercontroller.Userdb.Usersdb.Favorites。它会导致难以编写和支持的单元测试过载。这是一个完美的迹象,表明 Controller 做了比它应该做的更多的事情:

  • 如果未找到用户,则返回未授权响应
  • 返回授权用户的收藏夹列表

如何存储用户以及如何获取收藏夹是业务逻辑的任务。简化的 Controller 操作可能如下所示:

public IHttpActionResult GetFavorites()
{
string userName = this.User.Identity.Name;
if (!this.userService.IsAuthorized(userName))
{
return this.Unauthorized();
}
var favs = this.userService.GetFavorites(userName);
return Ok(favs);
}

检查操作是否返回未授权访问的单元测试:

  // arrange
var userService = Substitute.For<IUserService>();
var controller = new FavoritesController(userService);

// act
var result = controller.GetFavorites();

// assert
result.Should().BeOfType<UnauthorizedResult>();

检查操作是否返回用户收藏夹的测试:

  // arrange
var userService = Substitute.For<IUserService>();
var controller = new FavoritesController(userService);

var favorites = new[] { "fav1", "fav2" };
userService.IsAuthorized("John").Returns(true);
userService.GetFavorites("John").Returns(favorites);

controller.User = Substitute.For<IPrincipal>();
controller.User.Identity.Name.Returns("John");

// act
var result = controller.GetFavorites();

// assert
result.Should().BeOfType<OkNegotiatedContentResult<string[]>>();
((OkNegotiatedContentResult<string[]>)result).Content.Should().BeSameAs(favorites);

最后,IUserService 接口(interface):

public interface IUserService
{
bool IsAuthorized(string userName);

string[] GetFavorites(string userName);
}

关于c# - 如何编写 Web Api 单元测试,我应该从 UserManager 获取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28109710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com