Comment l'unité de test avec ILogger dans ASP.NET de Base

C'est mon contrôleur:

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);
    }
}

Comme vous pouvez le voir j'ai 2 dépendances, un IDAO et un ILogger

Et c'est ma classe de test, j'utilise xUnit de tester et de Moq de créer des maquettes et le talon, je peux maquette DAO facile, mais avec le ILogger je ne sais pas quoi faire donc je viens de passer la valeur null et commentez l'appel pour vous connecter au contrôleur pour lancer le test. Est-il un moyen de tester, mais encore de maintenir l'enregistreur en quelque sorte ?

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());
    }
}
  • Vous pouvez utiliser une maquette comme un tampon, comme Ilya suggère, si vous n'êtes pas réellement en train de tester la méthode de journalisation lui-même a été appelé. Si c'est le cas, se moquant de l'enregistreur ne fonctionne pas, et vous pouvez tenter quelques approches différentes. J'ai écrit un court article montrant une variété d'approches. L'article comprend complet d'un dépôt GitHub avec chacune des différentes options. En fin de compte, ma recommandation est d'utiliser votre propre carte plutôt que de travailler directement avec les ILogger<T> type, si vous avez besoin d'être en mesure de
  • Comme @ssmith mentionné il y a quelques problèmes avec la vérification des appels réels pour ILogger. Il a quelques bonnes suggestions dans son article sur le blog et je suis venu avec ma solution qui semble résoudre la plupart des problèmes dans le réponse.
InformationsquelleAutor duc | 2017-04-15