我有一个应用程序,我正在进行单元测试。在正常使用情况下,App Delegate会设置并开始运行。但是,当我运行我的单元测试时,我希望App Delegate不会做太多,如果有的话。我将如何实现这一目标?似乎某些设置内容在测试运行器运行时正在运行,并且它往往会在测试运行时抛出异常,从而导致其失败。
答案 0 :(得分:1)
你想看看模拟(或双打)。一般来说,这是一种在进行测试时转移您的呼叫以绕过诸如服务器调用,打印,记录之类的事情的方法......
在最简单的形式中,你可以通过继承你想要为你的测试修改的对象来做到这一点。
说你有
@interface YourClass : NSObject
@property NSString *dataFromServer;
@end
@implementation YourClass
-(void) load
{
// Bunch of calls to the server you don't want to do while testing.
self.dataFromServer = dataFromServerCallsYouDontWantToRun;
}
-(NSString*) getServerData
{
return dataFromServer;
}
@end
假设您要测试getServerData,但由于调用数据库而不希望实际运行load。假设您只想将dataFromServer硬编码为@“Mock”。
在你的UnitTest项目中,从YourClass继承并覆盖你不想在测试中实际运行的任何函数。
@interface YourClassMock : YourClass
@end
@implementation YourClassMock
-(void) load
{
NSLog(@"In Mock");
self.dataFromServer = @"Mock";
}
@end
现在您的测试看起来像这样
- (void) testLoad
{
YourClassMock yourClass = [[YourClassMock alloc] init];
[yourClass load];
STAssertEquals([yourClass getServerData], @"Mock", @"Returns mock data");
}
所以你在没有实际调用复杂的加载方法的情况下完全测试getServerData。
这是一个基本的,自己做的例子,但是有很多库可以帮助加速这一过程,比如OCMock(http://ocmock.org/)。这可以为您创建模拟对象,而无需进行子类化。你应该调查一下。但希望您了解如何使用它。更多信息 - http://nshipster.com/unit-testing/