Обеспечение того, что класс публикует определенный NSNotification? - PullRequest
0 голосов
/ 30 июня 2009

Есть ли способ гарантировать, что класс публикует конкретный NSNotification?

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

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

1 Ответ

3 голосов
/ 30 июня 2009

Принципиально невозможно предсказать во время компиляции, что произойдет во время выполнения. Самое близкое, что вы можете получить, - это статический анализ, но даже это не может предсказать ничего, что происходит за пределами вашего собственного кода, например внутри 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 выше.

...