我目前的申请结构是 -
下面的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的新手,所以任何详细的解释都会非常感激。
答案 0 :(得分:0)
如何编写单元测试用例,检查用户是否使用Moq等进行了实际身份验证。
你没有! [Authorize]
背后的逻辑是ASP.NET源代码的一部分。它由Microsoft的ASP.NET团队测试。这不是您的代码,这意味着您不应该对其进行测试。
你可以做的是编写一个测试,检查你的控制器的方法是否标有这样的属性(参见this answer的想法)。这样的测试将为您提供一种保证,即您不会忘记使用此属性标记cruicial方法。
但是,您的主要单元测试重点应该放在Index
方法本身 - 它的作用和工作方式。在您的情况下,您要根据存储库中是否有任何项来验证返回的视图类型(请注意,您需要将IRepository
而不是MyRepository
传递给控制器的构造函数才能进行模拟)