2009-08-20 124 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