首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OCUnit测试是否存在UIAlertView

使用OCUnit测试是否存在UIAlertView
EN

Stack Overflow用户
提问于 2011-05-22 13:36:30
回答 4查看 2.9K关注 0票数 6

我正在开发一个应用程序,它会在点击退出按钮后显示一个UIAlertView,只有在游戏取得进展的情况下才会显示。我想知道您将如何使用OCUnit来拦截UIAlertView并与其交互,甚至检测它是否已经出现。我能想到的唯一一件事就是对[UIAlertViewDelegate willPresentAlertView]进行加密,但这让我想哭。

有没有人知道更好的方法呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-30 12:21:06

Update:请参阅我的博客文章

我的另一个答案的问题是-showAlertWithMessage:方法本身从未被单元测试使用过。“使用手动测试来验证一次”对于简单的场景来说并不是太糟糕,但错误处理通常涉及难以重现的不寻常情况。…此外,我有一种挥之不去的感觉,那就是我停了下来,也许还有更彻底的方法。的确有。

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

代码语言:javascript
复制
+ (Class)alertViewClass
{
    return [UIAlertView class];
}

可以使用"subclass and override“替换。(或者,使用依赖注入并将此类作为初始化器参数传递。)

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

代码语言:javascript
复制
Class alertViewClass = [[self class] alertViewClass];
id alert = [[alertViewClass alloc] initWithTitle:...etc...

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

代码语言:javascript
复制
- (void)show
{
    [[NSNotificationCenter defaultCenter] postNotificationName:MockAlertViewShowNotification
                                                        object:self
                                                      userInfo:nil];
}

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

代码语言:javascript
复制
+ (Class)alertViewClass
{
    return [MockAlertView class];
}

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

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

notification

  • Lets me的
  • 寄存器设置预期值
  • 在收到通知时,将根据

的预期值验证状态

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

票数 4
EN

Stack Overflow用户

发布于 2013-11-19 02:45:16

OCMock的最新版本(在撰写本文时为2.2.1)具有使这一点变得更容易的特性。下面是一些示例测试代码,这些代码将UIAlertView的"alloc“类方法存根,以返回模拟对象而不是真正的UIAlertView。

代码语言:javascript
复制
id mockAlertView = [OCMockObject mockForClass:[UIAlertView class]];
[[[mockAlertView stub] andReturn:mockAlertView] alloc];
(void)[[[mockAlertView expect] andReturn:mockAlertView]
          initWithTitle:OCMOCK_ANY
                message:OCMOCK_ANY
               delegate:OCMOCK_ANY
      cancelButtonTitle:OCMOCK_ANY
      otherButtonTitles:OCMOCK_ANY, nil];
[[mockAlertView expect] show];

[myViewController doSomething];

[mockAlertView verify];
票数 4
EN

Stack Overflow用户

发布于 2011-05-22 14:27:38

注意:请看我的另一个答案。我推荐它而不是这个。

在实际的类中,定义一个简短的方法来显示警报,如下所示:

代码语言:javascript
复制
- (void)showAlertWithMessage:(NSString message *)message
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                    message:message
                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
    [alert release];
}

对于您的测试,不要测试这个实际的方法。相反,使用"subclass and override“来定义一个简单地记录其调用和参数的间谍。假设原始类被命名为"Foo“。下面是一个用于测试的子类:

代码语言:javascript
复制
@interface TestingFoo : Foo
@property(nonatomic, assign) NSUInteger countShowAlert;
@property(nonatomic, retain) NSString *lastShowAlertMessage;
@end

@implementation TestingFoo
@synthesize countShowAlert;
@synthesize lastShowAlertMessage;

- (void)dealloc
{
    [lastShowAlertMessage release];
    [super dealloc];
}

- (void)showAlertWithMessage:(NSString message *)message
{
    ++countShowAlert;
    [self setLastShowAlertMessage:message];
}

@end

现在只要

  • 您的代码调用-showAlertWithMessage:而不是直接显示警告,
  • 您的测试代码实例化TestingFoo而不是Foo

您可以检查呼叫的数量,以显示警报和最后一条消息。

由于这不会执行显示警报的实际代码,因此请使用手动测试来验证一次。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6086260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档