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: и переопределите их в ваших фиктивных объектах.