我使用 Kinect Toolbox 的 KinectRecorder 类录制了 Kinect 骨架流。我想使用 Kinect 工具箱中的 KinectReplay 类在单元测试中重播整个录制的文件。录音作为嵌入式资源添加到我的测试项目中(可能不相关,但作为下面代码的解释)。
我面临的问题是 KinectReplay 类(特别是 ReplaySystem 类)使用 C# 的 Task Parallel 库来播放骨架帧。无需任何修改,这意味着我的单元测试会立即从对 KinectReplay.Start() 的调用中返回。
对 Kinect 工具箱没有修改:
[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 用于在带有回放数据的单元测试中执行算法的目标是不现实的,我会考虑其他解决方案!