2009-08-20 91 views
4

我写的WinForms/XNA应用程序,我需要一些方法来抽象出与GraphicsDevice的相互作用在我的控制器/型号代码。XNA:嘲讽的Texture2D

我创建了一个接口IGraphicsService。我将用它来抽象出加载纹理等东西。我无法弄清楚的是当我需要返回某种纹理信息时该怎么做。我应该创建一个包装Texture2D的类吗?我担心这会招致不必要的开销。我希望能够长期创建某种MockTexture2D。

这一切,这样我可以让我的应用程序更容易测试。我并不是很担心速度,但如果有一些解决方案不会产生太多开销,最终我想用它来使我的游戏更具可测性,那将会很不错。有什么建议么?

回答

3

我个人的看法是,GraphicsDevice的类太复杂,被嘲笑和谁做到了,尽管这将有更多的工作,以实际指导模拟做正确的事在他的测试(虽然他当然应该得到一枚奖牌努力:D)。

Visual Studio的“提取接口”重构只会让你有一半的方式。也许代码生成器可以创建一个完全转发的模拟。如果你担心性能,只要你的模拟界面反映真实的图形设备,你可以做一些神奇的#if ..#endif在发布版本中使用真正的GraphicsDevice,并通过调试版本的界面?

-

反正我自己的单元测试,我实际上是创建一种无形的形式,一个真正的图形设备为我的单元测试。这很好,运行我的单元测试的构建代理在VMware虚拟机的Windows XP上运行,Gentoo Linux x64作为主机操作系统。我正在测试着色器和rendertargets以及whatnot的实际渲染代码。在性能方面,我也不能抱怨 - 在10秒内执行1300次测试。

这是我用它来创建伪嘲弄图形设备服务的代码: MockedGraphicsDeviceService.cs和单元测试:MockedGraphicsDeviceService.Test.cs

的缺点,当然,是你不能为您在这样的伪什么期望-mocked图形设备(例如,对CreateTexture()的调用发生,宽度为234,高度为456?)。采取一些聪明的类设计来隔离足够的逻辑,这样我就可以测试我的图形类而不会破坏它们的抽象。至少我可以在所有这种方式得到的图形代码测试覆盖率:)

+0

的作者你解决方案实际上很有趣,但它实际上比我想要测试的要多一点。我有一个TileMap和一个瓷砖地图需要一个TileSheet。 TileSheet反过来需要一个纹理。我正在寻找一些方法来打破这种依赖性。我想我现在已经明白了。我创建了IGraphicsService和ITextureResource接口,并将加载纹理和纹理信息抽象出来。我不认为有一个简单的纹理包装类会成为性能的重大突破,尽管我没有数据来支持它,所以我可能是错的。 – smack0007 2009-08-21 20:10:53

+0

在单元测试中创建一个真实的,简单的图形设备的好主意。 – 2009-10-15 18:27:28

+0

严重的链接不再可用 – jmattheis 2016-08-10 16:05:45

1

你可以尝试使用Scurvy.Test编写单元测试。这样一来,你并不需要在所有嘲笑了图形设备,只是用实际的实例:-)

http://scurvytest.codeplex.com

免责声明:我说的lib

+0

可能是一个主意,把一个声明这个答案乔尔:) – MattDavey 2012-04-02 15:30:54

+0

什么免责声明,我写的测试框架?当然,我猜如果你认为这是必要的......如果有人使用它,我不会获得任何东西;-) – 2012-04-02 20:39:08

+1

是的,我可能是迂腐,但更好的错误谨慎的一面...只是试图使这是一个更好的地方! :) http://stackoverflow.com/faq#promotion) – MattDavey 2012-04-03 08:47:24