2009-08-20 9 views
4

私はWinForms/Xnaアプリを書いています。コントローラー/モデルコード内のGraphicsDeviceとのやりとりを抽象化する方法が必要です。Xna:Mocking Texture2D

インターフェイスIGraphicsServiceを作成しました。私はテクスチャを読み込むようなものを抽象化するためにそれを使用します。テクスチャ情報を返す必要があるときに何をすべきかがわかりません。私はTexture2Dをラップするクラスを作成する必要がありますか?私はこれが不必要なオーバーヘッドを招くことになると心配しています。長期的には何らかのMockTexture2Dを作成したいと思っています。

これは私のアプリをよりテスト可能にするためのものです。私はそれほどスピードを心配していませんが、最終的に私はゲームをよりテスト可能にするためにこれを使用したいので、オーバーヘッドにならないような解決策があればうれしいでしょう。助言がありますか?

答えて

3

私の個人的な意見では、GraphicsDeviceクラスはあまりにも複雑で嘲笑されていますが、これにもかかわらず誰でも実際に模擬テストに正しいことをするように指示します努力のために:D)。

Visual Studioの「抽出インターフェイス」リファクタリングでは、半分しか得られません。たぶん、コードジェネレータが完全転送用モックを作成する可能性があります。もしあなたがパフォーマンスについて心配しているのであれば、あなたのモックインターフェースが実際のグラフィックスデバイスを映している限り、#if ... #ifを使って、リリースビルドで実際のGraphicsDeviceを使用し、デバッグビルドのインターフェースを使うことができます。

-

とにかく、私自身のユニットテストのために、私は実際に私のユニットテストのために目に見えない形での実際のグラフィックスデバイスを作成しています。これは驚くほどうまく動作します。単体テストを実行するビルドエージェントは、ホストOSとしてGentoo Linux x64を使用してVMware仮想マシンのWindows XP上で動作します。私は実際のレンダリングコードをシェーダとレンダリングターゲットとそれ以外のものでテストしています。パフォーマンス面では、1300テストは10秒以内で実行されます。 MockedGraphicsDeviceService.csとそのユニットテスト:

この

は私が擬似嘲笑グラフィックスデバイスサービスを作成するために使用するコードです MockedGraphicsDeviceService.Test.cs

欠点は、もちろん、あなたがそのような擬似中の任意の期待を確認することができないということです-mockedグラフィックスデバイス(例えば、幅234、高さ456のCreateTexture()への呼び出しが発生しました)。ロジックを十分に分離するために巧妙なクラスデザインを取って、抽象クラスを壊さずに自分のグラフィックスクラスをテストすることができます。少なくとも私はこの方法でグラフィックスコードのテストカバレッジを得ることができます:)

+0

そのLIBの作者ですソリューションは実際に面白いですが、私が実際にテストしようとしているものより少しだけです。私はTileMapを持っており、タイルマップはTileSheetを必要とします。 TileSheetにはテクスチャが必要です。私はその依存関係を壊す方法を探しています。私は今それを持っていると思う。私はIGraphicsServiceとITextureResourceインターフェイスを作成し、読み込みテクスチャとテクスチャ情報を抽象化しています。私はテクスチャのための単純なラッパークラスを持つことはパフォーマンスのヒットの大きなものになるとは思わないが、私はそれをバックアップするデータがないので、私は間違っている可能性があります。 – smack0007

+0

単体テスト内で実際の裸のグラフィックデバイスを作成することをお勧めします。 –

+0

リンクが間違っています。 – jmattheis

1

あなたのユニットテストを書くためにScurvy.Testを使うことができます。そうすれば、あなたはすべてのグラフィックスデバイスをモックアップする必要はありません、ただ

http://scurvytest.codeplex.com

:-)実際のインスタンスを使用して免責事項:私はあなたの

+0

この回答に免責事項を入れることが考えられます。Joel :) – MattDavey

+0

このテストフレームワークを書いた免責条項はありますか?あなたがそれが必要だと思っているかどうか確かめてください...誰かがそれを使うかどうかを知っていれば何も得られません; –

+1

ええ、私はおそらく賢明ですが、注意の面で間違っている方が良いでしょう...だから、より良い場所! :) http://stackoverflow.com/faq#promotion) – MattDavey

関連する問題