设计 iPhone/iPad 应用程序以实现可测试性
我目前正在使用 GHUnit 和 OCMock 用于测试我的应用程序。我使用它们是因为我喜欢可以在实际设备上运行测试代码。
我的应用程序当前的设计方式是,我通过应用程序委托上的属性提供了一些中央服务和对象。例如,我集中了一些核心数据功能,可以通过 [UIApplication sharedApplication].coreData
访问这些功能。
我遇到的问题是,为了在设备或模拟器上运行单元测试,GHUnit 使用它自己的应用程序委托,该委托不具有这些属性。因此,如果一个单元触发想要访问它们的代码,它就会失败。
因此,我正在研究该应用程序的设计,并想知道是否应该重新设计这些核心设施的可用方式。你们是如何设计应用程序的?
我正在考虑的一件事是将这个功能提取到一个单独的对象中,以便我可以使用 OCMock 来模拟它以进行测试。
有什么想法吗?
I'm currently using GHUnit and OCMock for testing my app. I'm using them because I like the fact that I can run test code on the actual device.
The way my app is currently designed is that I have some central services and objects available through properties on the app delegate. For example, I've centralised some core data functionality which can be accessed by [UIApplication sharedApplication].coreData
.
The problem I've encountered is that in order to run unit tests on the device or simulator, GHUnit uses it's own app delegate which doesn't have these properties. So if a unit triggers code which wants to access them, it fails.
So I'm looking at the design of the app and wondering if I should redesign the way these core facilities are made available. How do you guys design your apps?
One thing I'm considering is extracting this functionality out to a separate object so that I can then use OCMock to simulate it for testing purposes.
Any thoughts?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
经过思考一段时间后,我意识到有一个更简单的解决方案。我使用应用程序委托的接口创建了一个类别,该类别适用于运行测试时使用的 GU 单元应用程序委托。这样我就可以运行测试并在必要时使用此类别返回 OC Mock。
After thinking about this a while I realised there was a simpler solution. I created a category with the app delegate's interface which applies to the GU Unit app delegate used when running the tests. This way I can get the tests to run and use this category to return OC Mocks when necessary.
还有另一种技术。这次我扩展了 GH 单元测试 iPhone 应用程序委托并添加了我需要的方法和属性。然后我修改了主类来调用它而不是原来的。
啊,有很多方法可以达到相同的结果:-)
And another technique. This time I extended the GH Unit test iPhone app delegate and added the methods and properties I needed. I then modified the main class to call that instead of the original.
Ahhh, so many ways to achieve the same result :-)