iOS单元测试如何阻止App Delegate执行操作

时间:2014-01-20 21:19:40

标签: ios unit-testing testing

我有一个应用程序,我正在进行单元测试。在正常使用情况下,App Delegate会设置并开始运行。但是,当我运行我的单元测试时,我希望App Delegate不会做太多,如果有的话。我将如何实现这一目标?似乎某些设置内容在测试运行器运行时正在运行,并且它往往会在测试运行时抛出异常,从而导致其失败。

1 个答案:

答案 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/