我正在开发一个应用程序,它会在点击退出按钮后显示一个UIAlertView,只有在游戏取得进展的情况下才会显示。我想知道您将如何使用OCUnit来拦截UIAlertView并与其交互,甚至检测它是否已经出现。我能想到的唯一一件事就是对[UIAlertViewDelegate willPresentAlertView]进行加密,但这让我想哭。
有没有人知道更好的方法呢?
发布于 2011-05-30 12:21:06
Update:请参阅我的博客文章
我的另一个答案的问题是-showAlertWithMessage:方法本身从未被单元测试使用过。“使用手动测试来验证一次”对于简单的场景来说并不是太糟糕,但错误处理通常涉及难以重现的不寻常情况。…此外,我有一种挥之不去的感觉,那就是我停了下来,也许还有更彻底的方法。的确有。
在被测类中,不要直接实例化UIAlertView。相反,应该定义一个方法
+ (Class)alertViewClass
{
return [UIAlertView class];
}可以使用"subclass and override“替换。(或者,使用依赖注入并将此类作为初始化器参数传递。)
调用此函数来确定要实例化以显示警报的类:
Class alertViewClass = [[self class] alertViewClass];
id alert = [[alertViewClass alloc] initWithTitle:...etc...现在定义一个模拟警报视图类。它的工作是记住它的初始化器参数,并发布一个通知,将自己作为对象进行传递:
- (void)show
{
[[NSNotificationCenter defaultCenter] postNotificationName:MockAlertViewShowNotification
object:self
userInfo:nil];
}您的测试子类(TestingFoo)重新定义了+alertViewClass来替换模拟:
+ (Class)alertViewClass
{
return [MockAlertView class];
}让您的测试类注册该通知。被调用的方法现在可以验证传递给警报初始值设定项的参数和发送-show消息的次数。
附加提示:除了模拟警报之外,我还定义了一个警报验证器类,它:
notification
的预期值验证状态
因此,我的警报测试现在所做的就是创建验证器,设置期望,并执行调用。
发布于 2013-11-19 02:45:16
OCMock的最新版本(在撰写本文时为2.2.1)具有使这一点变得更容易的特性。下面是一些示例测试代码,这些代码将UIAlertView的"alloc“类方法存根,以返回模拟对象而不是真正的UIAlertView。
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];发布于 2011-05-22 14:27:38
注意:请看我的另一个答案。我推荐它而不是这个。
在实际的类中,定义一个简短的方法来显示警报,如下所示:
- (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“。下面是一个用于测试的子类:
@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,您可以检查呼叫的数量,以显示警报和最后一条消息。
由于这不会执行显示警报的实际代码,因此请使用手动测试来验证一次。
https://stackoverflow.com/questions/6086260
复制相似问题