1

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

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.