2011-02-03 11 views
2

現在、latとlngの値をNSStringとして保持する単純なオブジェクトを扱っています。 [LocationParseJsonTest testLocationParseJson]:'41 0.6756668' は'41 0.6756668に等しくなければなりません - :私は、彼らは私がここにこのアプローチ/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); 
} 

wの失敗を取得等しい主張しようとしたときが、エラーが

エラーを示しています「実際の場所の緯度は、私が 『のisEqual』

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

ているassertTrueのアプローチを試してみましたので、代わり41.6756668

だったと私は取得します同じエラー

エラー: - [LocationParseJsonTest testLocationParseJson]: "[expectedLocation.lat isEqual:actualLocation.lat]"がtrueになります。実際の位置の緯度は41.6756668

どのようにこれらのNSString値をocUnitで比較すればよいですか?ここにあなたがそれらを比較することisEqualToString方法を使用する必要がありますNSStringsを比較するとき、私は信じている場所FYI

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

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

@end 
+1

2つのオブジェクトが実際にNSStringのインスタンスであることは肯定的ですか?おそらく、[expectedLocation.lat class]&[actualLocation.lat class]を含むように失敗メッセージを展開する必要があります。 – retainCount

+0

@retainCountあなたは勝者ですが、実際はNSDecimalNumberであり、期待されるのはNSCFStringです。代わりに文字列に変換するにはどうすればいいですか?ありがとうございます! –

+1

文字列にキャストしません。小数に対して適切に比較します(例:公差付き)。 –

答えて

2

この問題の最終的な解決策は、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

ための.hファイルです。

試してみてください。
STAssertTrue([expectedLocation.lat isEqualToString:actualLocation.lat], @"The actual location latitude was %@", actualLocation.lat);

EDIT:this StackOverflow questionの最初の答えはあなたの方法が機能しなかった理由として、いくつかの可能な説明があります。

+0

リンクありがとうございますが、isEqualToStringのアプローチではまだ運がありません –

+0

他の見えない文字があなたの文字列の1つになって比較に失敗する可能性はありますか?たぶん両方を 'NSData'オブジェクトに入れ、それぞれの' hex dump 'を比較する 'NSLog'を介してその記述を出力しますか? – arrtchiu

関連する問題