isKindOfClass для ложных объектов с OCMockito возвращает ноль

Я тестирую метод, этот метод вызывает другой, который перебирает NSArray различных объектов, эти объекты соответствуют protocol <MNBNotificableTrabel>, Этот метод проверяет, если каждый объект isKindOfClass: oneClass или другой класс и вернуть мне.

    for (id <MNBNotificableTravel> travel in self.travelList) {
        if ([travel isGoodForNotification] && [travel notificationType] == MNBNotificableTravelTypeEditable) {
            if ([notificableTravel numberOfPoisOrAssetsForNotification] < [travel numberOfPoisOrAssetsForNotification]) {
                if ([travel isKindOfClass:[MNBNotificableTravelList class]] && !notificableTravel])) {
                    notificableTravel = travel;
                } else if ([travel isKindOfClass:[MNBNotificablePoiListDraft class]]) {
                    notificableTravel = travel;
                } 
            }
        }
    }
    return notificableTravel;
}

Чтобы проверить это, я создал поддельный массив с mockedObjects, Я создал их разными способами и не используя mockProtocol()потому что я хочу различать их.

- (MNBNotificableTravelList *)fakeTravelListGoodForNotification:(BOOL)good numberOfPois:(NSUInteger)numberOfPois type:(MNBNotificableTravelType)type travelId:(NSString *)travelId {
    MNBNotificableTravelList * fakeTravel = mock([MNBNotificableTravelList class]);
    [given([fakeTravel isGoodForNotification]) willReturnBool:good];
    [given([fakeTravel notificationType]) willReturnInteger:type];
    [given([fakeTravel numberOfPoisOrAssetsForNotification]) willReturnInteger:numberOfPois];
    [given([fakeTravel travelID]) willReturn:travelId];
    return fakeTravel;
}

- (MNBNotificablePoiListDraft *)fakePoiListDraftGoodForNotification:(BOOL)good numberOfPois:(NSUInteger)numberOfPois type:(MNBNotificableTravelType)type travelId:(NSString *)travelId {
    MNBNotificablePoiListDraft * fakeTravel = mock([MNBNotificablePoiListDraft class]);
    [given([fakeTravel isGoodForNotification]) willReturnBool:good];
    [given([fakeTravel notificationType]) willReturnInteger:type];
    [given([fakeTravel numberOfPoisOrAssetsForNotification]) willReturnInteger:numberOfPois];
    [given([fakeTravel travelID]) willReturn:travelId];
    return fakeTravel;
}

- (void)testBuildLocalNotificationShouldCallScheduleMethodFourTimes {
    NSDate *installationDate = [NSDate date];
    [given([self.mockUserDefaults boolForKey:mnbUserHasAuthorizedLocation]) willReturnBool:YES];
    [given([self.mockUserDefaults objectForKey:mnbInstallationDateKey]) willReturn:installationDate];
    [given([self.mockDateGenerator notificationDatesForScheduleLifeCycleNotifications]) willReturn:[self fakeNotificationDatesWithInstallationDate:installationDate]];
    NSArray *fakeTravels = @[[self fakePoiListDraftGoodForNotification:YES numberOfPois:3 type:MNBNotificableTravelTypePublished travelId:@"1"],
                             [self fakePoiListDraftGoodForNotification:YES numberOfPois:3 type:MNBNotificableTravelTypeEditable travelId:@"3" ]];

    MNBLifeCycleNotificationBuilder *customSut = [[MNBLifeCycleNotificationBuilder alloc] initWithUserDefaults:self.mockUserDefaults application:self.mockApplication travelList:fakeTravels];
    [customSut buildLocalNotifications];
    [verifyCount(self.mockApplication, times(4)) scheduleLocalNotification:instanceOf([UILocalNotification class])];
}

Моя проблема возникает, когда я перебираю это NSArrayесли я наберу po travel вывод правильный, и я вижу, что это макет MNBNotificableTravelList или же MNBNotificablePoiListDraft, но если я наберу po [travel isKindOfClass:[MNBNotificableTravelList class]] выход всегда nil,

Я попытался добавить ответ на [isKindOfClass:] с помощью given, Но я думаю, что это не очень хороший способ, и ответом является шестнадцатеричное число.

Кто-нибудь знает, как я могу проверить это правильно.

Спасибо

1 ответ

Решение 1. Не используйте isKindOfClass в вашем коде. Самоанализ - это круто, но почти всегда лучше избегать его использования. Метод протокола, которому соответствуют все записи, может быть использован для консолидации логики или с помощью шаблона, такого как Inversion Of Control: http://en.wikipedia.org/wiki/Inversion_of_control может помочь вам не задавать объектам какого типа они являются. и переключение на его основе.

Решение 2: Пересмешивание / переопределение isKindOfClass: должно быть в порядке. Это фиктивные объекты, они должны вести себя нестандартно. Взгляните на документацию по NSObject для isKindOfClass: и isMemberOfClass: и переопределите их в ваших фиктивных объектах.

Другие вопросы по тегам