wjl*_*wjl 6 iphone unit-testing ocunit uialertview
我正在开发一个应用程序UIAlertView,只有在游戏进度完成时才会显示一个点击它的退出按钮.我想知道如何使用OCUnit拦截UIAlertView并与之交互,甚至检测它是否已经呈现.我唯一能想到的就是monkeypatch [UIAlertViewDelegate willPresentAlertView],但这让我想哭.
有谁知道更好的方法吗?
更新:请参阅我的博客文章如何对您的警报和操作表进行单元测试
\n\n我的另一个答案的问题是该-showAlertWithMessage:方法本身从未通过单元测试来执行。对于简单的场景来说,“使用手动测试验证一次”并不算太糟糕,但错误处理通常会涉及难以重现的异常情况。\xe2\x80\xa6此外,我有一种挥之不去的感觉,我已经停止了,并且可能有更彻底的方法。有。
在被测类中,不要UIAlertView直接实例化。相反,定义一个方法
+ (Class)alertViewClass\n{\n return [UIAlertView class];\n}\nRun Code Online (Sandbox Code Playgroud)\n\n可以使用“子类和覆盖”来替换。(或者,使用依赖注入并将此类作为初始值设定项参数传递。)
\n\n调用它来确定要实例化的类以显示警报:
\n\nClass alertViewClass = [[self class] alertViewClass];\nid alert = [[alertViewClass alloc] initWithTitle:...etc...\nRun Code Online (Sandbox Code Playgroud)\n\n现在定义一个模拟警报视图类。它的工作是记住其初始化参数,并发布通知,将其自身作为对象传递:
\n\n- (void)show\n{\n [[NSNotificationCenter defaultCenter] postNotificationName:MockAlertViewShowNotification\n object:self\n userInfo:nil];\n}\nRun Code Online (Sandbox Code Playgroud)\n\n您的测试子类(TestingFoo)重新定义+alertViewClass以替换模拟:
+ (Class)alertViewClass\n{\n return [MockAlertView class];\n}\nRun Code Online (Sandbox Code Playgroud)\n\n让您的测试类注册通知。-show调用的方法现在可以验证传递给警报初始值设定项的参数以及发送消息的次数。
附加提示:除了模拟警报之外,我还定义了一个警报验证器类:
\n\n因此,我现在所做的所有警报测试就是创建验证程序、设置期望并执行调用。
\n