2010-12-02 12 views
2

Je suis nouveau à l'objectif-c et je trouve que je ne sais pas comment affirmer correctement qu'une propriété de texte sur une étiquette donnée est égale à une valeur de chaîne brute. Je ne suis pas sûr si j'ai juste besoin de cast l'étiquette comme NSString ou si j'ai besoin de modifier ma déclaration d'assertion directement.Comment faire pour affirmer une propriété UILabel.text est égale à une instance de NSString dans l'objectif-c

@interface MoreTest : SenTestCase { 
    MagiczzTestingViewController* controller; 
} 

- (void) testObj; 

@end 

@implementation MoreTest 

- (void) setUp 
{ 
    controller = [[MagiczzTestingViewController alloc] init]; 
} 

- (void) tearDown 
{ 
    [controller release]; 
} 

- (void) testObj 
{ 
    controller.doMagic; 

    STAssertEquals(@"hehe", controller.label.text, @"should be hehe, was %d instead", valtxt); 
} 

@end 

La mise en œuvre de ma méthode doMagic est inférieure à

@interface MagiczzTestingViewController : UIViewController { 
    IBOutlet UILabel *label; 
} 

@property (nonatomic, retain) UILabel *label; 
- (void) doMagic; 

@end 

@implementation MagiczzTestingViewController 
@synthesize label; 

- (void) doMagic 
{ 
    label.text = @"hehe"; 
} 

- (void)dealloc { 
    [label release]; 
    [super dealloc]; 
} 

@end 

La construction est bien quand je modifie la assert de comparer une NSString première à un autre, mais lorsque je tente de saisir la valeur de texte (en supposant qu'il est de type NSString) échoue. Toute aide serait très appréciée!

+0

Remarque: Bien que le résultat final soit le même, il est plus clair d'appeler votre méthode en tant que '[controller doMagic]'. –

Répondre

2

Vous devez charger la plume du contrôleur de vue. Sinon, il n'y aura aucun objet pour la prise d'étiquettes à raccorder.

Une façon de faire est d'ajouter un Ivar pour la vue du contrôleur de vue de votre cas de test:

@interface MoreTest : SenTestCase { 
    MagiczzTestingViewController *controller; 
    UIView *view; 
} 
@end 

@implementation MoreTest 

- (void)setUp 
{ 
    [super setUp]; 

    controller = [[MagiczzTestingViewController alloc] init]; 
    view = controller.view; // owned by controller 
} 

- (void)tearDown 
{ 
    view = nil; // owned by controller 
    [controller release]; 

    [super tearDown]; 
} 

- (void)testViewExists 
{ 
    STAssertNotNil(view, 
     @"The view controller should have an associated view."); 
} 

- (void)testObj 
{ 
    [controller doMagic]; 

    STAssertEqualObjects(@"hehe", controller.label.text, 
     @"The label should contain the appropriate text after magic."); 
} 

@end 

Notez que vous devez également invoquer les méthodes de super--setUp et -tearDown correctement à partir de la vôtre.

Enfin, ne pas utiliser la syntaxe à points pour l'appel de méthode, ce n'est pas un remplacement générique pour la syntaxe de parenthèse dans les expressions de message. Utilisez la syntaxe à points seulement pour obtenir et définir l'état de l'objet.

7

STAssertEquals() vérifie identité des deux valeurs fournies, il est donc équivalent à faire:

STAssertTrue(@"hehe" == controller.label.text, ...); 

, vous voulez au lieu STAssertEqualObjects(), qui fait courir un contrôle isEqual: comme ce qui suit:

STAssertTrue([@"hehe" isEqual:controller.label.text], ...); 
+0

Je reçois toujours la même sortie (test échoué) dans la console avec la syntaxe isEqual: tout ce qui me manque quand j'essaie de tester les éléments IBOutlet? –

+0

L'interface IBOutlet est-elle connectée correctement? Si c'est le cas, la seule autre chose qui vient à l'esprit est que les tests unitaires ont tendance à être glitchy quand il s'agit de composants de l'interface utilisateur. Parfois, les composants de l'interface utilisateur ne s'initialisent pas, ne sont pas mis à jour (car ils dépendent d'une boucle d'exécution, par exemple), etc. –