.net 使用C#Task挂起nunit并使用Testflight在后台运行。如何进行单元测试?
我正在构建一个基于任务的服务器。我的问题是“用单元测试证明”如何正确工作: 下面的方法是应用程序的核心,需要是可靠的。我需要它来执行任务链,如果开始它的日期是在将来,那么就睡觉,等等。但是,当我使用nuni gui运行它时,它会永远挂断,并使用附加组件运行,并在后台运行,因此我无法从VS IDE停止它(即,运行,然后根据IDE完成,但继续在后台运行,需要杀死testdriven来停止它).net 使用C#Task挂起nunit并使用Testflight在后台运行。如何进行单元测试?,.net,unit-testing,nunit,task-parallel-library,testdriven.net,.net,Unit Testing,Nunit,Task Parallel Library,Testdriven.net,我正在构建一个基于任务的服务器。我的问题是“用单元测试证明”如何正确工作: 下面的方法是应用程序的核心,需要是可靠的。我需要它来执行任务链,如果开始它的日期是在将来,那么就睡觉,等等。但是,当我使用nuni gui运行它时,它会永远挂断,并使用附加组件运行,并在后台运行,因此我无法从VS IDE停止它(即,运行,然后根据IDE完成,但继续在后台运行,需要杀死testdriven来停止它) 您也可以给我们看一下您的测试吗?我只是直接从测试方法调用该方法,而不使用断言。所以您不必对其进行Wait()
您也可以给我们看一下您的测试吗?我只是直接从测试方法调用该方法,而不使用断言。所以您不必对其进行
Wait()
之类的操作?在这种情况下,这可能就是问题所在。
public Task RunPlan(plan thePlan)
{
List<BackupTask> tasks = this.nextTasks(thePlan);
List<Task> backupTasks = new List<Task>();
TimeSpan wait;
int i = 1;
Task run = new Task(() =>
{
Logging.Debug("Starting {0}", thePlan);
});
// Create a new token source
var primaryTokenSource = new CancellationTokenSource();
// Create the cancellation token to pass into the Task
CancellationToken token = primaryTokenSource.Token;
workerTokens.GetOrAdd(run, primaryTokenSource);
backupTasks.Add(run);
foreach (var t in tasks)
{
BackupTask job = t;
Task next = backupTasks.Last().ContinueWith(x =>
{
// Check to see if we've been cancelled
if (token.IsCancellationRequested)
{
Logging.Debug("Cancelled");
return;
}
//Si es en el futuro, esperar
wait = job.SuggestedDate - DateTime.Now;
if (wait.TotalSeconds > 0)
{
Logging.Debug("Sleeping {0} secs..", wait.TotalSeconds);
//http://stackoverflow.com/questions/1141617/thread-interrupt-to-stop-long-sleep-at-app-shutdown-is-there-a-better-approach
//Thread.Sleep(TimeSpan.FromSeconds(wait.TotalSeconds));
while (!stopping)
{
lock (padlock)
{
Monitor.Wait(padlock, TimeSpan.FromSeconds(wait.TotalSeconds));
}
}
}
// Check to see if we've been cancelled
if (token.IsCancellationRequested)
{
Logging.Debug("Cancelado");
return;
}
job.doWork();
},TaskContinuationOptions.LongRunning);
backupTasks.Add(next);
}
backupTasks.First().Start();
return backupTasks.Last();
}
[Test]
public void testFullBackup()
{
taskMgr.RunPlan(plans.First()).Wait();
Assert.AreEqual(0, taskMgr.workerTokens.Count());
}