【发布时间】:2017-09-11 10:54:52
【问题描述】:
这是我的控制器:
public class BlogController : Controller
{
private IDAO<Blog> _blogDAO;
private readonly ILogger<BlogController> _logger;
public BlogController(ILogger<BlogController> logger, IDAO<Blog> blogDAO)
{
this._blogDAO = blogDAO;
this._logger = logger;
}
public IActionResult Index()
{
var blogs = this._blogDAO.GetMany();
this._logger.LogInformation("Index page say hello", new object[0]);
return View(blogs);
}
}
如您所见,我有 2 个依赖项,一个 IDAO 和一个 ILogger
这是我的测试类,我使用 xUnit 进行测试,使用 Moq 创建模拟和存根,我可以轻松模拟 DAO,但使用 ILogger 我不知道该怎么做,所以我只是传递 null并在运行测试时注释掉登录控制器的调用。有没有办法测试但仍然以某种方式保留记录器?
public class BlogControllerTest
{
[Fact]
public void Index_ReturnAViewResult_WithAListOfBlog()
{
var mockRepo = new Mock<IDAO<Blog>>();
mockRepo.Setup(repo => repo.GetMany(null)).Returns(GetListBlog());
var controller = new BlogController(null,mockRepo.Object);
var result = controller.Index();
var viewResult = Assert.IsType<ViewResult>(result);
var model = Assert.IsAssignableFrom<IEnumerable<Blog>>(viewResult.ViewData.Model);
Assert.Equal(2, model.Count());
}
}
【问题讨论】:
-
您可以使用模拟作为存根,正如 Ilya 建议的那样,如果您实际上并未尝试测试是否调用了日志记录方法本身。如果是这种情况,模拟记录器不起作用,您可以尝试几种不同的方法。我写了一个short article 展示了各种方法。文章包括a full GitHub repo with each of the different options。最后,我的建议是使用您自己的适配器,而不是直接使用 ILogger
类型,如果您需要能够 -
正如@ssmith 提到的,在验证
ILogger的实际调用时存在一些问题。他的博文中有一些很好的建议,我的解决方案似乎解决了answer below 中的大部分问题。
标签: c# unit-testing asp.net-core moq ilogger