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

s73*_*v3r 5 testing unit-testing ios

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

ans*_*ble 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
Run Code Online (Sandbox Code Playgroud)

假设您想要测试 getServerData,但由于调用数据库而不想实际运行加载。假设您只想将 dataFromServer 硬编码为@“Mock”。

在您的 UnitTest 项目中,继承 YourClass 并覆盖您不想在测试中实际运行的任何函数。

@interface YourClassMock : YourClass

@end

@implementation YourClassMock

-(void) load
{
    NSLog(@"In Mock");
    self.dataFromServer = @"Mock";
}

@end
Run Code Online (Sandbox Code Playgroud)

现在你的测试看起来像这样

- (void) testLoad
{
    YourClassMock yourClass = [[YourClassMock alloc] init];
    [yourClass load];
    STAssertEquals([yourClass getServerData], @"Mock", @"Returns mock data");
}
Run Code Online (Sandbox Code Playgroud)

因此,您正在完全测试 getServerData,而无需实际调用复杂的加载方法。

这是一个基本的、自己动手的示例,但是有很多库可以帮助加快速度,例如 OCMock ( http://ocmock.org/ )。这可以为您创建模拟对象,而无需子类化。你应该调查一下。但希望您了解如何使用它。更多信息 - http://nshipster.com/unit-testing/