2010-12-02 2 views
2

Я новичок в объектно-c, и я обнаружил, что не знаю, как правильно утверждать, что свойство text на определенная метка равна исходному строковому значению. Я не уверен, что мне нужно просто нарисовать метку как NSString или мне нужно напрямую изменить инструкцию assert.Как утверждать свойство UILabel.text равно экземпляру NSString в объекте-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 

Реализация моего метода doMagic ниже

@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 

Сборки хорошо, когда я изменить Assert для сравнения необработанного NSString к другому, но когда я пытаюсь захватить текстовое значение (если это типа NSString), он терпит неудачу. Любая помощь приветствуется!

+0

Примечание: в то время как конечный результат одинаков, идиоматически яснее вызывать ваш метод как `[controller doMagic]`. – 2010-12-07 07:05:06

ответ

2

Вам необходимо загрузить наконечник контроллера вида. В противном случае не будет никаких объектов для подключения метки.

Один из способов сделать это, чтобы добавить Ивар для просмотра контроллера представления для вашего теста:

@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 

Обратите внимание, что вы также должны ссылаться супер в -setUp и -tearDown методы соответственно внутри вашей.

И, наконец, не использовать использовать синтаксис точки для вызова метода, это не является общей заменой синтаксиса скобки в выражениях сообщений. Используйте точечный синтаксис только для получения и установки состояния объекта.

7

STAssertEquals() проверяет идентичности из двух значений, при условии, так что это эквивалентно делать это:

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

Вместо этого, вы хотите STAssertEqualObjects(), который будет на самом деле запустить isEqual: проверку, как следующее:

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

Я все еще получаю такой же результат (неудачный тест) в консоли с синтаксисом isEqual: что-нибудь еще, что мне не хватает, когда я пытаюсь проверить элементы IBOutlet? – 2010-12-07 18:49:46