单元测试XNA:我需要模拟我的GraphicsDevice

时间:2009-04-28 21:22:09

标签: c# .net unit-testing xna

我在使用XNA框架 为了帮助我,我做了一个看起来像这样的帮助类:

ActorHolder
+ SpriteBatch (SpriteBatch)
+ ContentManager (ContentManager)
- drawables (IList<IDrawable>)
- updatables (IList<IUpdatable>)

+ ActorHolder(GraphicsDevice, ContentManager)
+ Draw(GameTime)
+ Update(GameTime)
+ AddActor(IActor)
+ RemoveActor(IActor)
+ GetCollidingActors(IActor)

现在我想对这个班级进行单元测试。但正如您所看到的,我的构造函数需要一个图形设备和一个内容管理器。虽然我认为这在我的应用程序中很明显,但在我的测试中却没有 我应该嘲笑这两个只是为了进行单元测试还是我的设计存在缺陷?

- UPDATE--
我找到了一个可能有用的项目链接:http://scurvytest.codeplex.com/ 没有任何xp,因为编码必须为社交生活腾出空间。

- Note--
对不起,我的UML法语,我的公司不使用它,所以我从来没有使用它,除了回到学校。

3 个答案:

答案 0 :(得分:7)

我通过在不可见窗口上实际创建一个真实的图形设备来“嘲弄”图形设备。性能出乎意料地好 - 大约1500次测试需要12秒。

它允许我测试需要图形设备的代码并进行一些基本验证(例如,是正确的纹理集,是否选择了顶点缓冲区等)。这可以通过使用带有DirectX Debug Runtime的参考光栅化器来进行更密集的检查来改进。

如果我需要验证发送到图形设备的内容,我创建了一个接口,通过该接口,被测代码可以发送顶点 - 然后可以使用标准模拟对象框架轻松模拟。

检查此问题以获取有关模拟XNA图形设备相关类的另一个讨论:Mocking Texture2D

以下是我使用真实图形设备“模拟”的类: MockedGraphicsDeviceService.csMockedGraphicsDeviceService.Test.cs

(编辑:修复损坏的链接)

答案 1 :(得分:2)

这似乎是一个非常有效的模拟使用场景。我不认为这个设计存在缺陷 -

存在模拟的一个原因是帮助填写在测试时不可用的接口的资源需求,例如远程对象,或者在您的情况下,图形资源。对我来说,模拟图形设备和内容管理器似乎很合适。

答案 2 :(得分:0)

正如我从 my other 问题中发现的那样,不应轻视GraphicsDevice。 特别是XNA社区论坛上的This discussion指出了为什么嘲笑它不是一个好主意。

我仍在寻找一个很好的解决方案。但是,我倾向于认为:

  • 这是我的架构中的一个设计缺陷(我应该更多地分离我的组件)
  • 这是XNA的设计缺陷