2009-06-30 5 views
0

Есть ли способ гарантировать, что класс отправляет конкретную NSNotification?Обеспечение того, чтобы класс помещал определенную NSNotification?

(У меня есть набор классов, и я хотел бы использовать во время компиляции (если возможно), что класс несет требуемую NSNotification).

В противном случае, если это невозможно, есть ли какое-либо обходное решение?

ответ

3

Это невозможно предсказать во время компиляции, что произойдет во время выполнения. Самое близкое, что вы можете получить, это статический анализ, но даже это не может предсказать ничего, что происходит вне вашего собственного кода, например, внутри Foundation.

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

Вам понадобится создать целевую тестовую связку, если вы еще этого не сделали. Ваша цель будет использовать SenTestingKit для запуска ваших тестов, которые вы создаете. (На iPhone вам также понадобится Google Toolbox для, мм, у них есть a handy tutorial on using GTM for iPhone tests.)

Вы создадите подкласс SenTestCase, чтобы проверить, отправляет ли ваш реальный объект уведомление. Это будет выглядеть примерно так:

@interface FrobnitzerNotificationsTest: SenTestCase 
{ 
    BOOL frobnitzerDidCalibrate; 
} 

- (void) frobnitzerDidCalibrate:(NSNotification *)notification; 

@end 

@implementation FrobnitzerNotificationsTest 

- (void) testFrobnitzerCalibratePostsNotification { 
    Frobnitzer *frobnitzer = …; 
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 

    [nc addObserver:self 
     selector:@selector(frobnitzerDidCalibrate:) 
     name:FrobnitzerDidCalibrate 
     object:frobnitzer]; 

    frobnitzerDidCalibrate = NO; 

    //This should post a notification named FrobnitzerDidCalibrate with the receiver as the object. 
    [frobnitzer calibrate]; 
    //If it did, our notification handler set frobnitzerDidCalibrate to YES (see below). 

    [nc removeObserver:self 
     name:FrobnitzerDidCalibrate 
     object:frobnitzer]; 

    STAssertTrue(frobnitzerDidCalibrate, @"Frobnitzer did not post a notification when we told it to calibrate"); 
} 

- (void) frobnitzerDidCalibrate:(NSNotification *)notification { 
    frobnitzerDidCalibrate = YES; 
} 

@end 

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

Также, если вы используете GTM, вы должны заменить GTMSenTestCase для SenTestCase выше.

+0

Я смею сказать, что у меня что-то не хватает, но у Apple есть несколько классов (NSView, ABPeoplePickerView), которые обещают отправлять уведомления, когда происходит определенное событие. Я не могу понять, как тестовые примеры будут обеспечивать, чтобы эти уведомления были отправлены, как просил Ноктюрн. –

+0

Если для уведомления (или любой другой вещи, например, для рисования в изображении перед Snow Leopard) требуется подключение к серверу окон, вы не сможете проверить его в инструменте командной строки, предоставляемом OCUnit. Вам нужно будет реализовать что-то, что запускает тесты в приложении. В методе тестового примера код будет таким же: Добавить наблюдателя, установить переменную экземпляра в «НЕТ», вызвать уведомление (установить переменную экземпляра в «YES» в методе уведомления), удалить наблюдателя, утверждать, что экземпляр переменная - 'YES'. –

Смежные вопросы