我在编写XCTestCase时遇到了一个问题。我正在研究客户端/服务器应用程序。用户只能在应用程序登录到服务器时开始使用系统,该服务器在以下位置自动完成:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// connect to server and login
[mySys login:^{
login = YES;
}];
}
我的所有测试用例只能在登录标志为YES时运行。因为登录有时可能需要。这意味着我必须让我的所有测试至少等待一段时间(例如,30秒)。它是这样的:
-(void)setUp
{
// Need to be blocked here until timeout !!!
AppDelegate* app = [UIApplication sharedApplication].delegate;
if ( app.login )
{
// quit from the block !!!
}
}
实施此策略的最佳策略是什么?感谢
答案 0 :(得分:2)
创建一个实际上没有调用服务器的模拟登录,并在登录已设置为YES的情况下获取完成块。我推荐eBay关于TDD的技术讲座,它涵盖了这个场景。
我建议观看整个视频,但这里有指向特定部分的链接:https://www.youtube.com/watch?v=_CeWMxzB1SI#t=1805
答案 1 :(得分:0)
感谢杰夫的回答。我从视频中学到了很多东西。在我认真考虑之后,我仍然会在单元测试中测试我的Rest API。主要是因为我是使用Rest API的人。我想同时测试我的客户端和服务器。如果我正在开展一个大项目并且模型更复杂,我肯定会选择杰夫的想法。
最后,我将展示我的解决方案:(等待操作在开始测试之前完成)。我们的想法是编写一个继承自XCTextCase的基类。我正在使用NSNotification来广播登录事件。
- (void)setUp
{
[super setUp];
AppDelegate* app = [UIApplication sharedApplication].delegate;
if ( ![app isLogin] )
{
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(onLogin:) name:NOTIFICATION_LOGIN object:nil];
NSDate* loopUntil = [NSDate dateWithTimeIntervalSinceNow:10];
NSDate *dt = [NSDate dateWithTimeIntervalSinceNow:0.1];
while (!self.bCheckIn && [loopUntil timeIntervalSinceNow] > 0) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:dt];
}
}
}
- (void)tearDown
{
[[NSNotificationCenter defaultCenter]removeObserver:self name:NOTIFICATION_LOGIN object:nil];
[super tearDown];
}
- (void)onLogin:(NSNotification *)notification
{
self.bLogin = YES;
}