Воспроизведение данных 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 для отработки алгоритмов в модульных тестах с данными воспроизведения, я рассмотрю другие решения!

0 ответов

Другие вопросы по тегам