как проверить равенство объектов с помощью xcttest?

Мой метод возвращает NSNumber*, и я хочу протестировать этот метод. Поскольку моим фактическим возвращаемым значением является NSNumber*, я создаю новое ожидаемое значение NSNumber*, но оно терпит неудачу. Вот код:

NSNumber *cRating = [movie getRating:ratingDictionary ratingType:criticRating];
XCTAssertEqualObjects(cRating, [[NSNumber alloc]initWithInt:70], @"");

Ошибка:

[SFModelTest testGetCriticRatingMethod] failed: ((cRating) equal to ([[NSNumber alloc]initWithInt:70])) failed: ("70") is not equal to ("70")

Поскольку он говорит, что «70» не равно «70», я предполагаю, что это связано с alloc init. Некоторые вещи указателя, которые не равны. Может кто-нибудь помочь? Спасибо.

Изменить для комментария: добавление метода getRating

- (NSNumber *)getRating:(NSDictionary *)movieDic ratingType:(enum RatingsEnum) rating{

    NSNumber *result = 0;
    NSNumber *ratingNum = 0;

    switch (rating) {
        case userRating:
        {
            ratingNum = [movieDic objectForKey:@"audience_score"];
            break;
        }
        case criticRating:
        {
            ratingNum = [movieDic objectForKey:@"critics_score"];
            break;
        }
        default:
            break;
    }

    if(ratingNum && ratingNum > 0)
    {
        result = ratingNum;
    }

    return result;
}

Метод возвращает NSNumber. И мой тест:

NSNumber *cRating = [movie getRating:ratingDictionary ratingType:criticRating];
XCTAssertEqualObjects(cRating, [[NSNumber alloc]initWithInt:70], @"");

Когда я делаю класс NSLOG, он возвращает __NSCFConstantString. Я сейчас в замешательстве.


person U-L    schedule 21.01.2014    source источник
comment
В методе getRating:ratingType: как вы создаете NSNumber?   -  person nhgrif    schedule 21.01.2014
comment
NSNumber *результат = 0; а затем я возвращаю результат в конце метода.   -  person U-L    schedule 21.01.2014
comment
попробуйте зарегистрировать класс cRating. то есть NSLog(@"%@", [cRating class]) и конечно же это не NSString или что-то еще   -  person Bryan Chen    schedule 21.01.2014
comment
Что произойдет, если вы замените [movie getRating:ratingDictionary ratingType:criticRating]; только на [[NSNumber alloc]initWithInt:70]?   -  person ansible    schedule 21.01.2014
comment
класс __NSCFConstantString.   -  person U-L    schedule 21.01.2014
comment
так что ваш модульный тест правильный. @"70" (строка) отличается от @70 (число)   -  person Bryan Chen    schedule 21.01.2014
comment
Спасибо @BryanChen, я это понимаю. Я не говорю, что в XCTest есть ошибка. Я знал, что это мой код, когда задавал вопрос, но не могли бы вы помочь понять, почему? Я новичок в ObjectiveC. Насколько я могу судить, это происходит, когда я запрашиваю значение у словаря. Все остальное - NSNUmber.   -  person U-L    schedule 21.01.2014
comment
вы должны быть в состоянии отследить проблему самостоятельно. подсказка: как вы создали ratingDictionary   -  person Bryan Chen    schedule 21.01.2014
comment
Спасибо @BryanChen. Так что это очень интересно. Я меняю словарь, чтобы создать значение NSNumber вместо @70, которое NSString и теперь тест проходит. В моем коде я использую NSDictionary *object = [NSJSONSerialization JSONObjectWithData: параметры данных: 0 ошибка: ноль]; в коде для его создания, и это помещает NSNumber, а не NSString. Еще раз спасибо!   -  person U-L    schedule 21.01.2014


Ответы (1)


Я думаю, что вы делаете что-то не так, потому что XCTAssertEqualObjects(@(1), @(1), @"Not equal."); или XCTAssertEqualObjects([NSNumber numberWithInt:1], [NSNumber numberWithInt:1], @"Not equal.");, если вы не знакомы с литералами, пройдет.

Вы должны проверить метод getRating:ratingType:, чтобы увидеть, какой тип объекта он возвращает.

Попробуйте добавить точку останова непосредственно перед этим XCTAssertEqualObjects и проверьте экземпляр cRating.

person arturgrigor    schedule 21.01.2014
comment
Я добавил больше кода. Проблемы, похоже, связаны с преобразованием объекта словаря в NSNumber. Но я не могу это зафиксировать. - person U-L; 21.01.2014
comment
Единственный способ, которым я мог думать об этом, и вы должны быть уверены, что значения верны, - это то, что данные, из которых значения movieDic имеют свои значения, находятся в формате JSON, и вы не сериализовали их должным образом. - person arturgrigor; 21.01.2014