Обеспечение того, чтобы класс размещал определенное NSNotification?

StackOverflow https://stackoverflow.com/questions/1062191

Вопрос

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

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

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top