2013-10-28 43 views
0

我一直在想如何爲我的遊戲設置OCUnit單元測試,使用cocos2d。所以我跟着這些指示成立最初的測試目標:http://blog.shalomfriss.com/?p=894如何爲cocos2d應用程序設置單元測試?

不幸的是,下面的代碼觸發信號SIGABRT當我運行通過產品測試>測試在Xcode.它打破了功能似乎是在[CCGLProgram compileShader:type:byteArray:]

@implementation GameTests 

- (void)setUp 
{ 
    [super setUp]; 
} 

- (void)tearDown 
{ 
    // Tear-down code here. 

    [super tearDown]; 
} 

- (void)testExample 
{ 
    STAssertNotNil([InitialLayer scene], @"initial layer scene was null."); 
} 

@end 

這是InitialLayer現場方法:

+(CCScene *) scene 
{ 
    CCScene *scene = [CCScene node]; 
    InitialLayer*layer = [InitialLayernode]; 

    [scene addChild: layer]; 

    return scene; 
} 

一些其他可能相關的信息:

  • 目標設備:iPad的6.1
  • xcode版本:4.6.3
  • cocos2d版本2.1

有誰知道如何解決這個問題還是有更好的辦法,一般設置測試使用OCUnit或任何其他測試框架?

回答

2

你不想單元測試任何與cocos2d相關的東西。如果沒有在setUp方法中正確設置cocos2d CCGLView,Director等等(應用程序委託中的代碼),將無法開始工作。

即使你設置了它,你也總是會測試cocos2d本身,這會使你的測試更加孤立,你幾乎需要爲每個測試設置一個全新的場景,以測試任何代碼子類節點。這意味着寫測試的時間以及每個測試快速運行的時間都會增長。

更復雜的問題是,cocos2d的更新與CADisplayLink更新綁定在一起,我甚至不確定它們在運行單元測試時會被解僱。即使更新確實發生了,你也無法測試它們,因爲單元測試只運行一次並結束,它沒有「在特定時間段內運行」的概念。因此,像「將節點移動到x,y並檢查它在3秒後到達那裏」這樣的東西本質上不能用cocos2d和單元測試的方式進行測試。至少不是沒有大量修改cocos2d本身。

如果您認爲cocos2d代表了您的應用程序的視圖,那麼真正的問題是:爲什麼您甚至想要首先單元測試與視圖相關的任何內容?

相反,你可以做的是設計你的類完全獨立於視圖。例如,您可以創建額外的遊戲邏輯類,將其添加到節點的userObject屬性中,然後控制節點 - 實際可測試的遊戲邏輯發生在模型類中。您可以擁有額外的控制器類,它們可以啓動運行動畫或粒子效果等任何事情,以及任何其他與視圖無關的東西,因爲在最糟糕的情況下它看起來不正確,但它不會影響遊戲玩法。

測試驅動開發的關鍵好處之一是讓類可測試,並且這意味着不要讓它們依賴於視圖。所以你的第一個目標實際上應該是運行而不是 cocos2d的測試。

如果您想了解如何做到這一點,請查看OpenGW,特別是class reference。除了將遊戲對象的(OGWEntity)位置和旋轉推送到視圖委託(OGWNode)之外,絕對不存在對視圖代碼的依賴。基於實體狀態對視圖執行操作的中間類是OGWController。

所有這些都使得OpenGW成爲一款高度可測試的遊戲模擬引擎。事實上,它與視圖相關的任何東西都是如此分離的,我正在使用Sprite Kit和cocos2d-iphone來運行相同的代碼。

相關問題