如何在 ASP.NET Core 中使用 ILogger 进行单元测试 [英] How to unit test with ILogger in ASP.NET Core

查看:50
本文介绍了如何在 ASP.NET Core 中使用 ILogger 进行单元测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的控制器:

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 进行单元测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆