Отображение частных свойств с категориями

Я хочу открыть частные свойства контроллера представления, чтобы я мог их протестировать. Один из способов сделать это — создать категорию в классе только для тестирования и использовать метод категории для получения значения.

// Class I want to test -- implementation
#import "SomeViewController.h"

@interface SomeViewController ()
@property (strong, nonatomic)UIActionSheet *sheet;
@end

// Category's header
#import "SomeViewController.h"

@interface SomeViewController (Test)
-(UIActionSheet *)getSheetValue;
@end

// Category's implementation
#import "SomeViewController+Test.h"

@implementation SomeViewController (Test)
-(UIActionSheet *)getSheetValue{
    return self.sheet;    // references private property
}
@end

Есть лучший способ сделать это? Я подумал, может быть, я мог бы просто создать общедоступное свойство sheet в категории, которая ссылается на значение частного свойства, но не могу найти хорошей документации о том, как это сделать. Как лучше всего тестировать частные свойства, не полагаясь на ivars?


person jefflovejapan    schedule 08.03.2014    source источник


Ответы (2)


В частном порядке нужные вам методы уже существуют, категории просто нужно сделать их видимыми для теста:

@interface SomeViewController (Test)

- (UIActionSheet *) sheet;

@end

вам не нужно реализовывать этот метод, но теперь вы можете его использовать. У вас возникнут проблемы только в том случае, если вы сделаете видимым метод, который на самом деле не существует во время выполнения.

person Wain    schedule 08.03.2014
comment
Интересно. Xcode генерирует предупреждение, Method definition for 'sheet' not found - person jefflovejapan; 08.03.2014
comment
Где находится это предупреждение (в какой строке)? Обычно вы можете указать категорию в верхней части тестового файла, а не в совершенно другом файле. - person Wain; 08.03.2014
comment
В реализации категории @implementation SomeViewController (Test) - person jefflovejapan; 08.03.2014
comment
У вас не должно быть реализации категории - person Wain; 08.03.2014

Вы также можете использовать valueForKey:, но это не так "чисто", так как вы не получаете автозаполнение и можете сломаться, если вы переименуете свойство с помощью инструмента рефакторинга. Но это еще один вариант, если вы не хотите создавать категорию.

person Chris Wagner    schedule 08.03.2014