问题描述
这是我的控制器:
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
As you can see I have 2 dependencies, a IDAO
and a ILogger
这是我的测试类,我使用 xUnit 进行测试,使用 Moq 创建模拟和存根,我可以轻松模拟 DAO
,但是使用 ILogger
我不我不知道该怎么做,所以我只是通过 null 并在运行测试时注释掉登录控制器的调用.有没有办法测试但仍然以某种方式保留记录器?
And this is my test class, I use xUnit to test and Moq to create mock and stub, I can mock DAO
easy, but with the ILogger
I don't know what to do so I just pass null and comment out the call to log in controller when run test. Is there a way to test but still keep the logger somehow ?
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());
}
}
推荐答案
只需模拟它以及任何其他依赖项:
Just mock it as well as any other dependency:
var mock = new Mock<ILogger<BlogController>>();
ILogger<BlogController> logger = mock.Object;
//or use this short equivalent
logger = Mock.Of<ILogger<BlogController>>()
var controller = new BlogController(logger);
您可能需要安装 Microsoft.Extensions.Logging.Abstractions
包才能使用 ILogger
.
You probably will need to install Microsoft.Extensions.Logging.Abstractions
package to use ILogger<T>
.
此外,您可以创建一个真正的记录器:
Moreover you can create a real logger:
var serviceProvider = new ServiceCollection()
.AddLogging()
.BuildServiceProvider();
var factory = serviceProvider.GetService<ILoggerFactory>();
var logger = factory.CreateLogger<BlogController>();
这篇关于如何在 ASP.NET Core 中使用 ILogger 进行单元测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!