如何使用授权属性为控制器操作编写失败的单元测试用例

本文关键字:失败 单元 测试用例 操作 授权 何使用 属性 控制器 | 更新日期: 2023-09-27 18:35:48

我当前的应用程序结构是 -

下面是 MyController 类,它使用如下所示的 MyRepository 类。

public class MyController : Controller
{
    private readonly MyRepository _repository;
    public MyController() : this(new MyRepository())
    {
    }
    public MyController(MyRepository repository)
    {
        _repository = repository;
    }
    [Authorize]
    public ActionResult Index()
    {
        var items = _repository.GetAllItems();
        if (items.Count() == 0)
             return View("EmptyItems");
        else
        {
             return View("List", items);
        }
    }
}

我的存储库类如下。

public class MyRepository : IRepository
{
    private readonly TodoDbContext _dbcontext;
    private readonly ISecurityService _securityService;

    public MyRepository() : this(new TestDbContext(), new SecurityService())
    {                        
    }
    public MyRepository(TestDbContext context, ISecurityService securityService)
    {
        _dbcontext = context;
        _securityService = securityService;
    }
    public IEnumerable<MyModel> GetAllItems()
    {
         var userid = _securityService.GetUser();
         var list = _dbcontext.TotalItems.Where(e => e.UserId == userid);
         return list;
    }
}

单元测试方法如下 -

[TestMethod]
public void IndexAction_Should_Return_View_For_AllItems()
{
    //Arrage            
    var controller = MyController();
    //Act
    var result = controller.Index();
    //Asset
    Assert.IsNotNull(result as ViewResult);
}

上面显示的单元测试方法总是成功的。它不会检查用户是否经过身份验证。如何编写一个单元测试用例来检查用户是否实际使用 Moq 等进行身份验证。我是MVC的新手,所以任何详细的解释将不胜感激。

如何使用授权属性为控制器操作编写失败的单元测试用例

如何编写一个单元测试用例来检查用户是否实际使用 Moq 等进行身份验证。

你没有![Authorize]背后的逻辑是 ASP.NET 源代码的一部分。它由 ASP.NET 团队在Microsoft进行测试。这不是你的代码,这意味着你不应该测试它

你可以做的是编写一个测试来检查你的控制器的方法是否用这样的属性标记(有关想法,请参阅此答案)。这样的测试会给你保证,你没有忘记用这个属性标记十字方法。

但是,您的主要单元测试重点应该放在方法本身Index - 它的作用和工作原理。在您的情况下,您希望根据存储库中是否有任何项目来验证返回哪种视图(请注意,您需要传递IRepository而不是MyRepository到控制器的构造函数以模拟它)。