2014-01-20 33 views
5

我有一個應用程序,我正在進行單元測試。在正常使用情況下,App Delegate設置了一些東西,並開始運行。然而,當我運行我的單元測試時,我希望App Delegate不要做太多的事情,如果有的話。我將如何去完成這件事?看起來,一些安裝的東西在運行測試運行器時正在運行,並且它往往在測試運行時引發異常,導致它失敗。iOS單元測試如何停止應用程序從做東西代表

+0

此答案可以幫助[Xcode項目如何以編程方式檢測目標或如何使用env vars](http://stackoverflow.com/a/6964951/310903) – voromax

+1

[Xcode中的單元測試,它運行的應用程序?](http://stackoverflow.com/questions/15714697/unit-testing-in-xcode-does-it-run-the-app)你會在那裏找到答案。 – Sulthan

回答

1

你想看看Mocks(或雙打)。一般來說,這是一種在進行測試以繞過諸如服務器調用,打印,日誌記錄之類的測試時轉移呼叫的方式...

以最簡單的形式,您可以通過將您想要修改的對象試驗。

說你有

@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 

說你想測試getServerData,但不希望實際運行,因爲調用數據庫的負載。假設您只想將dataFromServer硬編碼爲@「Mock」。

在您的UnitTest項目中,從YourClass繼承並覆蓋您不想在測試中實際運行的任何函數。

@interface YourClassMock : YourClass 

@end 

@implementation YourClassMock 

-(void) load 
{ 
    NSLog(@"In Mock"); 
    self.dataFromServer = @"Mock"; 
} 

@end 

現在你的測試看起來像這樣

- (void) testLoad 
{ 
    YourClassMock yourClass = [[YourClassMock alloc] init]; 
    [yourClass load]; 
    STAssertEquals([yourClass getServerData], @"Mock", @"Returns mock data"); 
} 

所以你完全不用實際調用您的複雜負載測試方法getServerData。

這是一個基本的,做你自己的例子,但有很多庫,以幫助加快這一點,如OCMock(http://ocmock.org/)。這可以爲你創建模擬對象,而不需要任何子類。你應該看看。但希望你明白你將如何使用它。更多信息 - http://nshipster.com/unit-testing/

+0

我喜歡你關於嘲笑的信息,但在OP的情況下,這將如何工作,由於應用程序的競爭條件開始與測試?我的意思是,XCTestCase是否可以在應用程序的啓動生命中的某個特定時刻執行,並且可以預測,以便可以模擬應用程序委託的啓動功能? – stonedauwg

+0

XCTest是它自己的目標。它運行而不是應用程序來執行部分代碼。理想情況下,一次只進行一小部分單元測試。當你運行測試時,你不是直接運行你的應用程序。 NSHipster鏈接解釋它很好。 – ansible