2014-05-23 44 views
0

我在写XCTestCase时遇到问题。我正在研究客户端/服务器应用程序。用户只能开始使用该系统时,这是自动完成的应用程序登录到服务器:只能在某些情况下启动XCTest

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    // connect to server and login 
    [mySys login:^{ 

     login = YES; 
    }]; 

} 

我所有的测试情况下,当登录标志是只能运行。因为登录可能有时需要。这意味着我必须让所有测试至少等待一段时间(例如30秒)。这是这样的:

-(void)setUp 
{ 
    // Need to be blocked here until timeout !!! 
    AppDelegate* app = [UIApplication sharedApplication].delegate; 
    if (app.login) 
    { 
     // quit from the block !!! 
    } 
} 

什么可能是最好的策略来实现呢?谢谢

回答

2

创建一个模拟登录,它实际上不会调用服务器,并且将登录已设置为YES的完成模块。我建议eBay关于TDD的技术讨论,它涵盖了这种情况。

我建议观看整个视频,但这里是一个链接到特定部分:https://www.youtube.com/watch?v=_CeWMxzB1SI#t=1805

+0

这太好了。但这取决于我要测试的内容。如果我要测试模型的逻辑。这将是一个很大的帮助。但实际上我也想用这个测试用例来测试Web服务。 –

+0

那么,你可以使用不同的单元测试方法来调用模拟对象,或者真正的模拟对象。但通常你不会在客户端单元测试Web服务,因为它只是一个连接。您可以在本地存根JSON响应(或任何它)。 – Tim

+0

我想在这里测试Web服务的原因是因为我也是创建Web服务的人。所以我想节省一些时间一起测试它。如果Web服务就像Facebook,Tweitter等,那么我基本上可以使用模拟或存根方法。但就我而言,这样做可能太麻烦。因为我必须更改模拟/存根,因此在更改Web服务时进行建模。 –

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; 
} 
相关问题