Pregunta

¿Hay alguna manera de garantizar que una clase mensajes NSNotification un particular?

(I tienen un conjunto de clases, y me gustaría hacer cumplir en tiempo de compilación (si es posible) que los puestos de clase un NSNotification requerido).

Por otra parte, si eso no es posible, ¿hay alguna solución?

¿Fue útil?

Solución

Es fundamentalmente imposible predecir en tiempo de compilación lo que sucederá en tiempo de ejecución. Lo más cerca que se puede conseguir es el análisis estático, pero incluso eso no se puede predecir todo lo que sucede fuera de su propio código, como el interior de la Fundación.

Puede, sin embargo, hacer esto con las pruebas de unidad, ya que el corredor de prueba realmente ejecuta el código bajo prueba.

Usted tendrá que crear un destino de paquete de prueba, si no lo ha hecho. Su objetivo utilizar SenTestingKit a ejecutar las pruebas, que se creen. (En el iPhone, también necesitará Google Toolbox para, eh, Mac. Ellos tienen un tutorial útil sobre el uso de GTM para iPhone pone a prueba .)

Vamos a crear una subclase SenTestCase para probar si sus mensajes de objetos reales una notificación. Se verá algo como esto:

@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

Usted necesitará una variable de instancia y un método de notificación-controlador para cada notificación que desee probar, y un método de prueba para todos los métodos que desea probar para las notificaciones.

Además, si usa GTM, se deberá sustituir GTMSenTestCase para SenTestCase anteriormente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top