2013-11-07 3 views
2

Я пытаюсь проверить, что моя карта показывает параметры местоположения, которые я им даю. Я использую Nib для моего контроллера (я ненавижу Storyboards).XCTest, ViewController с Nib & MKMapView

Проблема, с которой я столкнулся, заключается в том, что моя карта равна нулю в моем тесте. Карта инициализируется в Nib и не инициализируется в моем текущем коде. Я попытался инициализировать мой Nib с помощью ViewController, но это не работает в XCTest.

#import <XCTest/XCTest.h> 
#include "HomeVC.h" 

@interface homeVCTests : XCTestCase { 
    HomeVC* homeVC; 
} 

@end 

@implementation homeVCTests 

- (void)setUp 
{ 
    [super setUp]; 

    homeVC = [[HomeVC alloc] initWithNibName:@"HomeVC" bundle:nil]; 
    [homeVC viewDidLoad]; 
} 

- (void)tearDown 
{ 
    [super tearDown]; 
} 

- (void)testHomeHasMap // Fails 
{ 
    XCTAssertNotNil(homeVC.map, @"Map is not nil."); 
} 

- (void)testHomeHasMapTypeHybrid // Fails 
{ 
    XCTAssertEqual(homeVC.map.mapType, MKMapTypeHybrid, @"Map type is hybrid(2)"); 
} 

- (void)testHomeHasMapWithMyLocation // Fails 
{ 
    [homeVC setMapCurrentLocation:37.785834 lon:-122.406417]; 
    CLLocationCoordinate2D checkpoint = CLLocationCoordinate2DMake(37.785834, -122.406417); 
    XCTAssertEqual(homeVC.map.centerCoordinate.latitude, checkpoint.latitude, @"Map shows my location."); 
} 

@end 

HomeVC.h

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 
#import <CoreLocation/CoreLocation.h> 
#import "AppDelegate.h" 

@class User; 
@class LoginRegisterVC; 

@interface HomeVC : UIViewController <CLLocationManagerDelegate, MKMapViewDelegate> { 
IBOutlet MKMapView* map; 
CLLocationManager* locationManager; 
CLLocationCoordinate2D currentLocation; 
LoginRegisterVC* loginRegVC; 

User* user; 

} 
@property(nonatomic, strong)LoginRegisterVC* loginRegVC; 
@property(nonatomic, strong)User* user; 
@property(nonatomic, strong)IBOutlet MKMapView* map; 
@property(nonatomic, strong)CLLocationManager* locationManager; 
@property(nonatomic)CLLocationCoordinate2D currentLocation; 


-(void)setMapCurrentLocation:(float)lat lon:(float)lon; 
@end 

HomeVC.m

#import "HomeVC.h" 
#import "User.h" 
#import "LoginRegisterVC.h" 

#define METERS_PER_MILE 1609.344 

@interface HomeVC() 

@end 

@implementation HomeVC 
@synthesize map, locationManager, loginRegVC, user; 
@synthesize currentLocation = _currentLocation; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
// Custom initialization 
} 
return self; 
} 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

//self.map = MKMapView.new; 
self.map.mapType = MKMapTypeHybrid; 
self.map.delegate = self; 

//NSLog(@"%lu", self.map.mapType); 

[self startStandardUpdates]; 

[self setMapCurrentLocation:self.locationManager.location.coordinate.latitude 
lon:self.locationManager.location.coordinate.longitude]; 

} 

- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

-(void)viewDidAppear:(BOOL)animated 
{ 
[super viewDidAppear:true]; 

if (self.user.loggedIn==false) { 
self.loginRegVC = LoginRegisterVC.new; 
self.loginRegVC.user = self.user; 
[self presentViewController:self.loginRegVC animated:true completion:nil]; 
} 
} 

- (void)startStandardUpdates 
{ 
if (nil == self.locationManager) 
self.locationManager = [[CLLocationManager alloc] init]; 

self.locationManager.delegate = self; 
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 

self.locationManager.distanceFilter = 5; // meters 

[self.locationManager startUpdatingLocation]; 
} 

- (void)locationManager:(CLLocationManager *)manager 
didUpdateToLocation:(CLLocation *)newLocation 
fromLocation:(CLLocation *)oldLocation 
{ 
NSLog(@"%f, %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude); 
[self setMapCurrentLocation:newLocation.coordinate.latitude lon:newLocation.coordinate.longitude]; 
} 

- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error 
{ 

} 

-(void)setMapCurrentLocation:(float)lat lon:(float)lon 
{ 
self.currentLocation = CLLocationCoordinate2DMake(lat, lon); 
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.currentLocation, 
0.5*METERS_PER_MILE, 
0.5*METERS_PER_MILE); 
[self.map setRegion:region animated:true]; 
NSLog(@"map center: %f, %f", self.map.centerCoordinate.latitude, self.map.centerCoordinate.longitude); 
} 
@end 

ответ

1

Это невозможно сделать юнит-тесты, как это для контроллеров отображения, которые реализуют асинхронные методы. Ваши тестовые методы выполняются мгновенно, поэтому вы не можете видеть результаты. Вы можете использовать семафоры или другие методы, чтобы приостановить runloop, пока штаты не выполнит ваши требования.

+0

Ahh. Это имеет смысл. Благодарю. –

Смежные вопросы