对不同任务的语句 运行 的方法进行单元测试

Unit testing a method whose statements run on different task

我有一个方法:

public class WorkerClass : IWorkerClass
{
private int myworkId = 0;
public void Workflow(int theWorkid)
        {
            var aTask = new Task(() =>
            {
                this.myworkId = theWorkid;
                //Some calculations
              
            });

            aTask.Start();
        }
}

我有一个单元测试方法:

[DataTestMethod]
[DataRow(23)]
public class workerTester
{
 public void WorkflowTest(int theWorkflowMode)
        {
            // Arrange 
           
            var aWorkTester = new Mock<IWorkerClass>();
            var aExpectedWorkflowMode = 23;
            myWorkerPrivateObj = new PrivateObject(aWorkTester);

            // Act

            myWorkerPrivateObj .Invoke("Workflow", theWorkflowMode);

            // Assert

            //Thread.Sleep(1000); If i uncomment it works
            var aActualWorkflowModeType = myWorkerPrivateObj.GetField("myworkId");
            Assert.AreEqual(aExpectedWorkflowModeType, aActualWorkflowModeType);
            
        }
}

如果我取消注释 Thread.Sleep(1000),aActualWorkflowModeType 为 23。但是如果我注释它,aActualWorkflowModeType 为 0。我假设我的断言在我的任务完成之前被调用。 我如何才能等到单元测试中的任务完成?

我想出了一种方法来进行单元测试:

     var lookupTask = Task<WorkerClass>.Factory.StartNew(() =>
                {
                    return new WorkerClass();
                });
    
                lookupTask.Wait();

所以我的新单元测试方法如下所示:

[DataTestMethod]
[DataRow(23)]
public class workerTester
{
 public void WorkflowTest(int theWorkflowMode)
        {
            // Arrange 
           
            var aWorkTester = new Mock<IWorkerClass>();
            var aExpectedWorkflowMode = 23;
            myWorkerPrivateObj = new PrivateObject(aWorkTester);

            // Act

            myWorkerPrivateObj .Invoke("Workflow", theWorkflowMode);
            var lookupTask = Task<WorkerClass>.Factory.StartNew(() =>
                {
                    return new WorkerClass();
                });

            // Assert
            lookupTask.Wait();
            var aActualWorkflowModeType = myWorkerPrivateObj.GetField("myworkId");
            Assert.AreEqual(aExpectedWorkflowModeType, aActualWorkflowModeType);
            
        }
}

这似乎有效