Qu'un message application de la classe un NSNotification particulier?
-
21-08-2019 - |
Question
Y at-il moyen de faire en sorte que les messages d'un de classe un NSNotification particulier?
(j'ai un ensemble de classes, et je voudrais appliquer à la compilation (si possible) que les postes de classe un NSNotification nécessaire).
Par ailleurs, si cela est impossible, est-il solution?
La solution
Il est fondamentalement impossible de prévoir au moment de la compilation ce qui se passera au moment de l'exécution. Le plus proche, vous pouvez obtenir est l'analyse statique, mais même cela ne peut pas prédire tout ce qui se passe en dehors de votre propre code, comme à l'intérieur Fondation.
Vous pouvez cependant faire avec des tests unitaires, puisque le coureur de test fonctionne en fait le code en cours de test.
Vous devez créer une cible de faisceau de test, si vous avez pas déjà. Votre cible utilisera SenTestingKit pour exécuter vos tests que vous créez. (Sur l'iPhone, vous aurez également besoin de Google Toolbox pour, euh, Mac. Ils ont un tutoriel pratique sur l'utilisation GTM pour les tests de l'iPhone .)
Vous allez créer une sous-classe SenTestCase pour vérifier si vos messages réels objet d'une notification. Ça va ressembler à quelque chose comme ceci:
@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
Vous aurez besoin d'une variable d'instance et une méthode de notification de gestionnaire pour chaque notification que vous souhaitez tester, et une méthode d'essai pour chaque méthode que vous voulez tester les notifications.
En outre, si vous utilisez GTM, vous devez remplacer GTMSenTestCase pour SenTestCase ci-dessus.