Brian Boyle
Brian Boyle

Reputation: 2879

Reskit - Mapping to array

I'm trying to run some unit tests to test my mappings with RestKit v0.20, however I am getting an error that my destination object is nil. I have track this down to the fact that the mapping is failing because the sourceType is an NSArray and my destinationType is an NSNumber. I think this is because my mapping keypaths are incorrect. I am trying to map the songCard JSON to my objet. I have included my JSON and mapping test below. It Would be great it someone could help me to set the correct keypath.

{"status" : 2000,
  "content" : {
    "cardList" : [
      {
        "songCard" : {
          "likes" : 2,
          "dislikes" : 3
        }
      }
    ]
  },
  "message" : "OK"
}

Unit Test class

- (RKObjectMapping *)songMetadataMapping
{
    RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[SongMetadata class]];
    [mapping addAttributeMappingsFromDictionary:@{
     @"content.cardList.songCard.likes":    @"likes"
     }];

    return mapping;
}

- (void)testSongMetadataMapping
{
    NSString *parsedJSON = [RKTestFixture parsedObjectWithContentsOfFixture:@"songMetadata.json"];
    RKMappingTest *test = [RKMappingTest testForMapping:[self songMetadataMapping] sourceObject:parsedJSON destinationObject:nil];
    [test addExpectation:[RKPropertyMappingTestExpectation expectationWithSourceKeyPath:@"content.cardList.songCard.likes" destinationKeyPath:@"likes" value:@"2"]];

    STAssertTrue([test evaluate], @"Mappings failed");

}

UPDATE After further debugging I have found that the value 2 in my JSON string is being evaluated as an NSArray, when this should be evaluated as NSNumber. As a quick test I removed the [ ] in my JSON and the value 2 was correctly evaluated as an NSNumber. This doesn't solve my problem though as I have need to identify my JSON as an array of songCard objects

Upvotes: 1

Views: 198

Answers (1)

Alex
Alex

Reputation: 8991

As you have noticed, you cannot use the keypath as you have specified when an array is in play. I can think of two options - the first is a long shot, but does the key path content.cardList[0].songCard.likes work?

Otherwise, consider using the method:

+ (instancetype)expectationWithSourceKeyPath:(NSString *)sourceKeyPath 
destinationKeyPath:(NSString *)destinationKeyPath 
evaluationBlock:(RKMappingTestExpectationEvaluationBlock)evaluationBlock;

With keypath content.cardList and supplying an evaluation block that 1) checks that the mapping is an array that contains a single object. You can then check that the object contains a songCard object and that has a likes value of 2.

Upvotes: 1

Related Questions