2011-02-03 1 views
2

В настоящее время я работаю с простым объектом, который имеет значение lat и lng как NSString. Но когда я пытаюсь утверждать, что они равны я получаю отказ ж/этот подходКак написать единичный тест для геопозиции с ocUnit

- (void) testLocationParseJson { 
    NSArray* items = //some array the represents the json returned from google ... 
    LocationParseJson* sut = [[LocationParseJson alloc] init]; 
    Location* actualLocation = [sut parseJson:items]; 

    NSString* actualLatitude = actualLocation.lat; 
    NSString* actualLongitude = actualLocation.lng; 

    STAssertEqualObjects(expectedLocation.lat, actualLocation.lat, @"The actual location latitude was %@", actualLocation.lat); 
} 

здесь ошибка показано

ошибка: - [LocationParseJsonTest testLocationParseJson]: '41 0,6756668' должен быть равен '41 .6756668 "фактическое местонахождение широта была 41.6756668

Так вместо этого я попробовал AssertTrue подход с„IsEqual“

STAssertTrue([expectedLocation.lat isEqual: actualLocation.lat], @"The actual location latitude was %@", actualLocation.lat); 

И я получаю такая же ошибка

Ошибка: - [LocationParseJsonTest testLocationParseJson]: "[expectedLocation.lat isEqual: actualLocation.lat]" должно быть правдой. Фактическая широта местоположения была 41.6756668

Как сравнить эти значения NSString в ocUnit? вот .h файл для размещения FYI

@interface Location : NSObject { 
    NSString* lng; 
    NSString* lat; 
} 

@property (nonatomic, retain) NSString* lng; 
@property (nonatomic, retain) NSString* lat; 

@end 
+1

Вы уверены, что оба объекта на самом деле являются экземплярами NSString? Возможно, вам следует расширить сообщение об ошибке, чтобы включить [expectedLocation.lat class] и [actualLocation.lat class]. – retainCount

+0

@retainCount вы являетесь победителем сэра, получается, что фактическим является NSDecimalNumber, и ожидается, что NSCFString ... так как я могу вместо этого использовать его как строку? Спасибо, сэр! –

+1

Вы не производите его как строку. Вы сравниваете его соответственно для десятичных чисел (например, с допуском). –

ответ

2

Окончательное решение этой проблемы ocUnit состояло в том, чтобы создать NSDecimalNumber и сравнить это с использованием STAssertTrue с isEqual. Надеюсь, это поможет кому-то еще!

- (void) testLocationParseJson { 
    NSString* data = @"{\"name\":\"50035\",\"Status\":{\"code\":200,\"request\":\"geocode\"},\"Placemark\":[{\"id\":\"p1\",\"address\":\"Bondurant, IA 50035, USA\",\"AddressDetails\":{\"Accuracy\":5,\"Country\":{\"AdministrativeArea\":{\"AdministrativeAreaName\":\"IA\",\"Locality\":{\"LocalityName\":\"Bondurant\",\"PostalCode\":{\"PostalCodeNumber\":\"50035\"}}},\"CountryName\":\"USA\",\"CountryNameCode\":\"US\"}},\"ExtendedData\": {\"LatLonBox\": {\"north\": 41.7947250,\"south\": 41.6631189,\"east\": -93.3662679,\"west\": -93.5322489}},\"Point\":{\"coordinates\":[-93.4805335,41.6756668,0]}}]}"; 
    NSArray* items = [data JSONValue]; 

    NSDecimalNumber* expectedLat = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", @"41.6756668"]]; 
    NSDecimalNumber* expectedLng = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", @"-93.4805335"]]; 

    LocationParseJson* sut = [[LocationParseJson alloc] init]; 
    Location* actualLocation = [sut parseJson:items]; 

    STAssertTrue([expectedLat isEqual: actualLocation.lat], @"The actual location lat was %@", actualLocation.lat); 
    STAssertTrue([expectedLng isEqual: actualLocation.lng], @"The actual location lng was %@", actualLocation.lng); 
} 
1

Я считаю, что при сравнении NSStrings вы должны использовать метод isEqualToString для их сравнения.

Try:
STAssertTrue([expectedLocation.lat isEqualToString:actualLocation.lat], @"The actual location latitude was %@", actualLocation.lat);

EDIT: Первый ответ в this StackOverflow question есть несколько возможных объяснений, почему ваш путь не работает.

+0

Спасибо за ссылку, но все же не повезло с подходом isEqualToString –

+0

Возможно ли, что некоторые другие невидимые символы превращают ее в одну из ваших строк, вызывая ее неудачное сравнение? Возможно, поместите оба в объекты NSData и распечатайте их описание через «NSLog», чтобы сравнить «шестнадцатеричный дамп» каждого из них? – arrtchiu