Принципиально невозможно предсказать во время компиляции, что произойдет во время выполнения. Самое близкое, что вы можете получить, - это статический анализ, но даже это не может предсказать ничего, что происходит за пределами вашего собственного кода, например внутри Foundation.
Однако вы можете сделать это с помощью модульных тестов, поскольку тестовый прогон фактически выполняет тестируемый код.
Вам нужно будет создать цель для тестового комплекта, если вы этого еще не сделали. Ваша цель будет использовать SenTestingKit для запуска ваших тестов, которые вы создаете. (На iPhone вам также понадобится Google Toolbox для Mac. У них есть удобное руководство по использованию GTM для тестов iPhone .)
Вы создадите подкласс 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 выше.