2014-05-09 60 views
3

我想運行涉及CLBeacons視圖控制器上的一些測試。不幸的是,雖然CLBeacons本身不是一個私有類,但它們的所有必需屬性都是隻讀的,沒有任何寫入訪問器。如何進行涉及CLBeacons的單元測試邏輯?

的方法寫的方式,將有助於最大限度地提高可測試性,但沒有生成CLBeacons的能力,我怎麼測試我的視圖控制器的關於他們的邏輯?

編輯:

來解釋我的目的範圍內,我在經歷多次在應用中的一些奇怪的行爲。我想通過測試各種場景並確認我的代碼中的各種其他相關組件正常工作,嘗試確認奇怪行爲的來源是在特定的代碼區域。 (例如,我可以測試我的數據處理是否正常工作,因此我會知道這是錯誤操作的動畫/佈局代碼)。

+0

你可以[模擬](http://ocmock.org/)的信標,並通過創建視圖控制器時,或簡單地作爲參數傳遞給一個給定的信標方法。 http://www.objc.io/issue-1/testing-view-controllers.html –

回答

4

我以OCMockito與XCTest做到了這一點。

CLBeacon *mockBeacon = mock([CLBeacon class]); 

然後,我可以用它來調用CoreLocation委託類的委託方法。該測試可能是這樣的:

- (void)testDidRangeOnABeacon 
{ 
    MyLocationDelegate *myDelegate = [[MyLocationDelegate alloc] init]; 

    CLLocationManager *mockManager = mock([CLLocationManager class]); 
    CLBeacon *mockBeacon = mock([CLBeacon class]); 
    CLBeaconRegion *mockRegion = mock([CLBeaconRegion class]); 


    [myDelegate locationManager:mockManager 
       didRangeBeacons:@[mockBeacon] 
         inRegion:mockRegion]; 


    // XCTAsserts... 
    XCTAssert([myDelegate.checkSomethingAboutRanging]); 
} 
1

既然你不能直接創建CLBeacon情況下,也許你可以重構你的方法把作爲參數CustomBeacon,這樣定義:

@interface CustomBeacon : NSObject 

@property (nonatomic, strong) NSNumber *major; 
@property (nonatomic, strong) NSNumber *minor; 
@property (nonatomic, assign) CLProximity proximity; 
// plus all other fields in CLBeacon.. 

+ (instancetype) customBeaconWithBeacon:(CLBeacon *) beacon; 
- (instancetype) initWithBeacon:(CLBeacon *) beacon; 

@end 

然後,你可以簡單地使用[[CustomBeacon customBeaconWithBeacon:realBeacon]代替realBeacon當你正在處理CLBeacon(後監測),並在您的測試,你可以直接實例化CustomBeacon實例。

不一樣乾淨使用CLBeacon,但是這是我能想到的關於可測性最好。