首页 > 解决方案 > 使用 xunit 和 .net core 3.1 进行单元测试时退出记录器

问题描述

在输出窗口中运行单元测试时,我试图从记录器获取输出,但没有显示。我在测试类中使用 ILoggingFactory。我希望从测试类和实际实现类(即 JobQueueManager)中看到我的所有日​​志。

测试.cs

public class ScheduledJobDatesTest :IClassFixture<ScheduleJobTestFixture>
    {
        private ScheduleJobTestFixture ScheduleJobFixtureHelper { get; }

        Mock<IDbConnection> mockJobQueueManager = new Mock<IDbConnection>();
        ILoggerFactory logger = new LoggerFactory();

        public ScheduledJobDatesTest(ScheduleJobTestFixture scheduleJobFixture)
        {
            ScheduleJobFixtureHelper = scheduleJobFixture;

            mockJobQueueManager.SetReturnsDefault(new SqlConnection());
            logger = LoggerFactory.Create(a => a.AddConsole());
            logger.CreateLogger("Executing Test");
        }

        [Fact]
        public void ValidScheduledJobDateForNextWeeklyAppointment()
        {
            Debug.WriteLine("Testing");
            logger.CreateLogger("Test").LogInformation("Test Information");
            //Arrange
            JobQueueManager jobQueueManager = new JobQueueManager(mockJobQueueManager.Object, logger.CreateLogger<JobQueueManager>());
            var scheduledJob = ScheduleJobFixtureHelper.GetMockedScheduledJob(JobType.Week);
            //Act
            bool isTrue = jobQueueManager.IsScheduledJobDateValidForJobType(scheduledJob.JobDate);
            //Assert
            Assert.True(isTrue);
        }

}

作业队列管理器.cs

public class JobQueueManager : IJobQueueManager
    {
        public IDbConnection DBConnection { get; }
        public ILogger<JobQueueManager> Logger { get; }

        public JobQueueManager(IDbConnection dbConnection, ILogger<JobQueueManager> logger)
        {
            DBConnection = dbConnection;
            Logger = logger;
            Logger.LogInformation("Initialized Job Queue Manager");
        }

    public bool IsScheduledJobDateValidForJobType(DateTime ScheduledJobDate)
        {
            Logger.LogDebug("Verifying  unit test");
            var currentDate = DateTime.Now;
            var nextJobDate = ScheduledJobDate;
            if (nextJobDate > currentDate)
            {
                var appointmentsDaysDifference = Math.Ceiling((nextJobDate - currentDate).TotalDays);
                if(appointmentsDaysDifference == 1)
                return true;
            }
            return false;
        }
}

标签: c#moqxunit

解决方案


您使用的是哪个版本的 xUnit?

如果您使用 xUnit.net 1.x,您之前可能已经将输出写入控制台、调试或跟踪。当 xUnit.net v2 默认开启并行化时,这种输出捕获机制不再适用;不可能知道可以并行运行的许多测试中的哪些负责写入这些共享资源。将代码从 v1.x 移植到 v2.x 的用户应该改用这两种新方法之一。

资源

似乎有很多方法可以解决这个问题,如果是我,我会考虑实现一个自定义提供程序


推荐阅读