使用OCUnit测试是否显示UIAlertView

wjl*_*wjl 6 iphone unit-testing ocunit uialertview

我正在开发一个应用程序UIAlertView,只有在游戏进度完成时才会显示一个点击它的退出按钮.我想知道如何使用OCUnit拦截UIAlertView并与之交互,甚至检测它是否已经呈现.我唯一能想到的就是monkeypatch [UIAlertViewDelegate willPresentAlertView],但这让我想哭.

有谁知道更好的方法吗?

Jon*_*eid 4

更新:请参阅我的博客文章如何对您的警报和操作表进行单元测试

\n\n

我的另一个答案的问题是该-showAlertWithMessage:方法本身从未通过单元测试来执行。对于简单的场景来说,“使用手动测试验证一次”并不算太糟糕,但错误处理通常会涉及难以重现的异常情况。\xe2\x80\xa6此外,我有一种挥之不去的感觉,我已经停止了,并且可能有更彻底的方法。有。

\n\n

在被测类中,不要UIAlertView直接实例化。相反,定义一个方法

\n\n
+ (Class)alertViewClass\n{\n    return [UIAlertView class];\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

可以使用“子类和覆盖”来替换。(或者,使用依赖注入并将此类作为初始值设定项参数传递。)

\n\n

调用它来确定要实例化的类以显示警报:

\n\n
Class alertViewClass = [[self class] alertViewClass];\nid alert = [[alertViewClass alloc] initWithTitle:...etc...\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在定义一个模拟警报视图类。它的工作是记住其初始化参数,并发布通知,将其自身作为对象传递:

\n\n
- (void)show\n{\n    [[NSNotificationCenter defaultCenter] postNotificationName:MockAlertViewShowNotification\n                                                        object:self\n                                                      userInfo:nil];\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您的测试子类(TestingFoo)重新定义+alertViewClass以替换模拟:

\n\n
+ (Class)alertViewClass\n{\n    return [MockAlertView class];\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

让您的测试类注册通知。-show调用的方法现在可以验证传递给警报初始值设定项的参数以及发送消息的次数。

\n\n

附加提示:除了模拟警报之外,我还定义了一个警报验证器类:

\n\n
    \n
  • 注册通知
  • \n
  • 让我设置期望值
  • \n
  • 收到通知后,根据预期值验证状态
  • \n
\n\n

因此,我现在所做的所有警报测试就是创建验证程序、设置期望并执行调用。

\n

  • 我认为课堂摆姿势在这里会更有用。如果我的单元测试框架妨碍了我的真实代码,我就会有一种恶心的感觉。我可以编写一个 UIAlertViewPoser,在显示警报时设置一个标志。http://www.cocoadev.com/index.pl?ClassPosing (2认同)