비동기 메소드를 구현하는 뷰 컨트롤러에 대해 이와 같은 단위 테스트를하는 것은 불가능합니다. 테스트 방법이 즉시 실행되므로 결과를 볼 수 없습니다. 주정부가 요구 사항을 충족 할 때까지 세마포어 또는 기타 기술을 사용하여 Runloop를 일시 중지 할 수 있습니다.
XCTEST, NIB & MKMAPVIEW가있는 ViewController
문제
내지도가 내가 제공하는 위치 매개 변수를 보여주고 있는지 테스트하려고합니다. 뷰 컨트롤러에 펜촉을 사용하고 있습니다 (스토리 보드가 싫어).
내가 겪는 문제는 내 맵이 내 테스트에서 나쁘다는 것입니다. 맵은 NIB에서 초기화되어 현재 코드에서 초기화되지 않습니다. 뷰 콘트롤러로 펜촉을 초기화하려고 시도했지만 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
해결책
제휴하지 않습니다 StackOverflow