s73*_*v3r 5 testing unit-testing ios
我有一个应用程序,我是单元测试.在正常使用情况下,App Delegate会设置并开始运行.但是,当我运行我的单元测试时,我希望App Delegate不会做太多,如果有的话.我将如何实现这一目标?似乎某些设置内容在测试运行器运行时正在运行,并且它往往会在测试运行时抛出异常,从而导致其失败.
你想研究模拟(或双打)。一般来说,这是一种在进行测试时转移调用以绕过服务器调用、打印、日志记录等操作的方法。
在最简单的形式中,您可以通过对要为测试修改的对象进行子类化来完成此操作。
说你有
@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/
| 归档时间: |
|
| 查看次数: |
1425 次 |
| 最近记录: |