只能在特定条件下启动XCTest

时间:2014-05-23 08:15:34

标签: ios xctest

我在编写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 !!!
    }
}

实施此策略的最佳策略是什么?感谢

2 个答案:

答案 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;
}