2013-04-28 58 views
1

我正在創建一個MonoGame項目,並希望針對現有代碼創建單元測試。我創建了一個測試項目,並開始對GameLopp類進行簡單的測試(我的項目隨附的Game1.cs類的重命名)。我創建了一個基本的「設置成功」測試做出一定比構造函數建立沒有問題:Monogame無法在單元測試中調用遊戲構造函數

public GameLoopTest() 
    { 
     using (GameLoop game = new GameLoop()) 
     { game.Run(); } 
    } 

    public void Dispose() 
    { 
     _gameloop = null; 
    } 

    [Fact] 
    public void GameLoop_Setup_Suceeds() 
    { 
     this.Should().NotBeNull(); 
    } 

令我困惑測試的構造函數拋出一個異常NullReference。如果我在調試模式下單步執行測試,則會得到一個更詳細的異常,它告訴我無法找到GraphicsDeviceManager。我搜索高和廣泛,但我一直無法想出爲什麼錯誤發生或如何解決。

我沒有大量的代碼在這個類,但我不想離開的東西如此重要的單元測試發現。

+0

我知道用測試來驗證構造是有點反模式的,但它似乎驗證它不是具體的測試代碼導致該問題的最佳途徑。 – ChargerIIC 2013-04-28 01:58:36

+0

你使用什麼樣的IoC /依賴注入框架? (你使用任何?)。在測試的情況下,你可能需要照顧你的IoC的設置嗎? – 2013-04-28 03:53:45

+0

使用Xunit/FluentAssertions。對於嘲笑我有NSubsitute。除此之外,它只是Monogame。我不相信我熟悉使用依賴注入本身。 – ChargerIIC 2013-04-28 15:21:25

回答

3

看看MonoGame中Game類的實現。

https://github.com/mono/MonoGame/blob/develop/MonoGame.Framework/Game.cs

在構造它創建一個GameServiceContainer,然後使用它在GraphicsDevice的吸氣劑,以得到一個IGraphicsDeviceService。

爲了使問題更困難GraphicsDeviceManager需要一個Game類在它的構造函數,並增加了自身作爲服務容器創建這兩個類之間的緊耦合的服務。

https://github.com/mono/MonoGame/blob/develop/MonoGame.Framework/GraphicsDeviceManager.cs

這不是單元測試時特別好的設計,而是因爲他們只是重新部署Microsoft XNA的行爲,它不是MonoGame隊的錯。

我懷疑你的問題是,你的GameLoop類依賴於在已經建立有效的遊戲類後者又在內部使用的服務容器。

我的建議是設計您自己的代碼,以便它可以進行單元測試,並嘗試從同樣的精神渲染代碼,你會分開視圖模型視圖脫鉤了。充其量,你也許可以使用屏幕截圖測試來確認,如果你真的很熱衷,就能正確渲染。

+0

儘管需要一些代碼雜耍來處理圖形設備管理器,但該解決方案仍能夠正常工作。 – ChargerIIC 2013-04-30 02:45:45