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

时间:2014-12-31 07:15:36

标签: c# asp.net-mvc-4 unit-testing authorization

我目前的申请结构是 -

下面的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);
        }
    }
}

MyRepository类在下面。

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的新手,所以任何详细的解释都会非常感激。

1 个答案:

答案 0 :(得分:0)

  

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

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

你可以做的是编写一个测试,检查你的控制器的方法是否标有这样的属性(参见this answer的想法)。这样的测试将为您提供一种保证,即您不会忘记使用此属性标记cruicial方法。

但是,您的主要单元测试重点应该放在Index方法本身 - 它的作用和工作方式。在您的情况下,您要根据存储库中是否有任何项来验证返回的视图类型(请注意,您需要将IRepository而不是MyRepository传递给控制器​​的构造函数才能进行模拟)