3

我在玩弄 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,因为编码必须为社交生活腾出一点空间。

--注意--
对不起,我的UML法语,我的公司不使用它,所以我除了在学校外从未使用过它。

4

3 回答 3

7

我通过在不可见的窗口上实际创建一个真实的图形设备来“模拟”图形设备。性能出奇的好——大约 1500 次测试需要 12 秒。

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

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

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

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

(编辑:修复断开的链接)

于 2009-10-15T08:03:49.310 回答
2

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

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

于 2009-04-28T21:33:16.630 回答
0

正如我从另一个问题中发现的那样,GraphicsDevice 不能掉以轻心。 XNA 社区论坛上的这个讨论特别指出了为什么模拟它不是一个好主意。

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

  • 这是我的架构中的一个设计缺陷(我应该更多地解耦我的组件)
  • 这是 XNA 的设计缺陷
于 2009-05-05T20:15:40.733 回答