Я использую RestKit ~> 0.20.3 и RestKit/Testing ~> 0.20.3. Так что это пример моего отображения:RestKit RKMappingTest JSON array
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[PlayerVO class]];
[mapping addAttributeMappingsFromArray:@[@"firstName", @"middeName", @"lastName", @"dob", @"sex"]];
Это мой фиктивный данные:
NSDictionary *data = @{@"players": @[@{@"firstName": @"Ahmed", @"middleName": @"Ahmed", @"lastName": @"Ahmed", @"dob": @"100", @"sex": @"m"}]};
Это мой mappingTest
:
RKMappingTest *mappingTest = [RKMappingTest testForMapping:mapping sourceObject:data destinationObject:nil];
И, наконец, мой expectation
:
RKPropertyMappingTestExpectation *expectation = [RKPropertyMappingTestExpectation expectationWithSourceKeyPath:@"players.firstName" destinationKeyPath:@"firstName" evaluationBlock:^BOOL(RKPropertyMappingTestExpectation *expectation, RKPropertyMapping *mapping, id mappedValue, NSError *__autoreleasing *error) {
BOOL expect = [mappedValue length] > 0;
XCTAssertTrue(expect);
return expect;
}];
[mappingTest addExpectation:expectation];
XCTAssertTrue([mappingTest evaluate]);
XCTAssertNoThrow([mappingTest verify]);
Таким образом, этот тест завершился неудачно, поскольку, похоже, я не могу указать путь к следующему ключу, поскольку data
является массивом. Это ошибка, я получаю:
testPlayerServiceGetPlayers] : (([mappingTest verify]) does not throw) failed: throwing "0x8e7d770: failed with error: (null)
RKMappingTest Expectations: (
"map 'players.firstName' to 'firstName' satisfying evaluation block"
)
Events: (
) during mapping from {
players = (
{
dob = 100;
firstName = Ahmed;
lastName = Ahmed;
middleName = Ahmed;
sex = m;
}
);
} to (null) with mapping <RKObjectMapping:0x8e6aad0 objectClass=PlayerVO propertyMappings=(
"<RKAttributeMapping: 0x8e6b880 firstName => firstName>",
"<RKAttributeMapping: 0x8e61df0 middeName => middeName>",
"<RKAttributeMapping: 0x8e2f580 lastName => lastName>",
"<RKAttributeMapping: 0x8e67a60 dob => dob>",
"<RKAttributeMapping: 0x8e2c120 sex => sex>"
)>"
Если изменить свои данные, чтобы:
NSDictionary *data = @{@"firstName": @"Ahmed", @"middleName": @"Naseer", @"lastName": @"Nuaman", @"dob": @"524534400", @"sex": @"m"};
И expectation
«s expectationWithSourceKeyPath
к @"firstName"
, тесты проходят. Поэтому это заставляет меня думать, что проблема явно связана с установкой ключевого пути. Теперь в моем приложении, что это сделано с помощью:
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping method:RKRequestMethodAny pathPattern:nil keyPath:@"players" statusCodes:statusCodes];
Однако я не могу найти способ настройки keyPath
для RKMappingTest
или RKPropertyMappingTestExpectation
, какие-либо идеи о том, как я могу добиться этого?
Update
Так что я имел взгляд через RKMappingTest.h
и нашел rootKeyPath
. Я установил следующее:
mappingTest.rootKeyPath = @"players";
И еще были проблемы, касающиеся mappedValue
в RKPropertyMappingTestExpectation
. Так что я также изменил мои данные на этом:
NSDictionary *data = @{@"players": @{@"firstName": @"Ahmed", @"middleName": @"Ahmed", @"lastName": @"Ahmed", @"dob": @"100", @"sex": @"m"}};
И теперь я могу видеть, что mappedValue
теперь установлено в Ahmed
и обновил RKPropertyMappingTestExpectation
к следующему:
RKPropertyMappingTestExpectation *expectation = [RKPropertyMappingTestExpectation expectationWithSourceKeyPath:@"firstName" destinationKeyPath:@"firstName" evaluationBlock:^BOOL(RKPropertyMappingTestExpectation *expectation, RKPropertyMapping *mapping, id mappedValue, NSError *__autoreleasing *error) {
return [mappedValue isEqualToString:@"Ahmed"];
}];
Но это с помощью объекта, а чем массив. Есть еще предложения?
Хм, это не кажется правильным. Почему я не могу тестировать сопоставление через посмеянный репрезентативный ответ с сервера? Поскольку RestKit должен быть набором инструментов для совершения вызовов на сервер, я хочу убедиться, что данные, которые я отправляю обратно, и способ, которым я сопоставляю и обрабатываю его, верны. –
Но ваш ключевой путь не является частью отображения, поэтому он не является частью теста сопоставления. – Wain
Итак, в чем смысл теста отображения? –