2013-10-28 40 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来运行相同的代码。

相关问题