1. ホーム
  2. c#

[解決済み] ASP.NET CoreでILoggerを使ったユニットテストを行う方法

2022-04-13 14:01:24

質問

これは私のコントローラです。

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つの依存関係があります。 IDAOILogger

そしてこれが私のテストクラスです。テストには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());
    }
}

解決方法は?

他の依存関係と同じようにモックすればいいのです。

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<T> .

さらに、本物のロガーを作ることができます。

var serviceProvider = new ServiceCollection()
    .AddLogging()
    .BuildServiceProvider();

var factory = serviceProvider.GetService<ILoggerFactory>();

var logger = factory.CreateLogger<BlogController>();