Pergunta

Estou tentando testar que meu mapa está mostrando parâmetros de localização que eu o dou. Estou usando uma ponta para o meu controlador de exibição (eu odeio storyboards).

O problema que encontrei é que meu mapa está nulo no meu teste. O mapa é inicializado na ponta e não está sendo inicializado no meu código atual. Tentei inicializar minha ponta com meu ViewController, mas isso não parece funcionar no 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
Foi útil?

Solução

É impossível fazer testes de unidade como este para controladores de exibição que implementam métodos assíncronos. Seus métodos de teste estão executando instantaneamente para que você não possa ver os resultados. Você pode usar semáforos ou outras técnicas para pausar o Runloop até que os estados atendam aos seus requisitos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top