2014-05-23 40 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; 
} 
相關問題