Воспроизведение данных Kinect в модульном тесте
Я записал скелетные потоки Kinect с помощью класса KinectRecorder на Kinect Toolbox. Я хотел бы воспроизвести весь записанный файл в модульном тесте, используя класс KinectReplay из Kinect Toolbox. Записи добавляются в мой тестовый проект как встроенные ресурсы (вероятно, не относящиеся к делу, но в качестве пояснения кода ниже).
Проблема, с которой я сталкиваюсь, заключается в том, что класс KinectReplay (в частности, класс ReplaySystem) использует библиотеку Task Parallel C# для воспроизведения кадров скелета. Без каких-либо модификаций это означает, что мой модульный тест немедленно возвращается из вызова KinectReplay.Start().
Нет изменений в Kinect Toolbox:
[Test]
public void CanPlaybackDataInNunitTest()
{
Type thisType = this.GetType();
Stream resourceStream =
thisType.Assembly.GetManifestResourceStream(
thisType.Namespace +".TestDataFiles.testfile.replay");
KinectReplay kinectReplay = new KinectReplay(resourceStream);
kinectReplay.SkeletonFrameReady += (sender, args) =>
{ //breakpoint gets set on this brace, never hit
//test
};
kinectReplay.Start();
// ...
}
Я попытался: добавить событие "ReplayFinished" .net в класс KinectReplay, добавить AutoResetEvent в класс KinectReplay и (как показано ниже) гибридное решение с использованием обработчиков событий и WaitHandles:
public void CanPlaybackDataInNunitTest()
{
Type thisType = this.GetType();
Stream resourceStream =
thisType.Assembly.GetManifestResourceStream(
thisType.Namespace +".TestDataFiles.testfile.replay");
KinectReplay kinectReplay = new KinectReplay(resourceStream);
// Initialize a wait handle to know when replay ends
AutoResetEvent isFinishedWaitHandle = new AutoResetEvent(false);
kinectReplay.SkeletonFrameReady += (sender, args) =>
{ // breakpoint here, never hit
//test
};
kinectReplay.Start();
// subscribe to a new event i added to the KinectReplay class
// This event is invoked when the IsFinished property becomes true
kinectReplay.ReplayFinished += (o, a) =>
{
isFinishedWaitHandle.Set();
};
// the unit test will block here and will not return until the 5 minute timeout
// I know that skeleton data is present within two seconds in the replay data
isFinishedWaitHandle.WaitOne(new TimeSpan(0, 0, 5, 0));
// ....
}
Если нереально использовать KinectToolbox для отработки алгоритмов в модульных тестах с данными воспроизведения, я рассмотрю другие решения!