如何断言UILabel.text属性等于objective-c中的NSString实例

时间:2010-12-02 01:32:05

标签: objective-c ocunit

我是objective-c的新手,我发现我不知道如何正确断言某个给定标签上的text属性等于原始字符串值。我不确定我是否只需要将标签强制转换为NSString,或者我是否需要直接修改我的断言语句。

@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进行比较时,构建很好但是当我尝试捕获文本值(假设它是NSString类型)时它失败了。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:7)

STAssertEquals()检查提供的两个值的身份,因此它等同于这样做:

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

相反,您需要STAssertEqualObjects(),它实际上会执行isEqual:检查,如下所示:

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

答案 1 :(得分:2)

您需要加载视图控制器的笔尖。否则标签插座就不会有任何物体连接起来。

执行此操作的一种方法是将视图控制器视图的ivar添加到测试用例中:

@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方法。

最后,使用点语法进行方法调用,它不是消息表达式中括号语法的通用替代。使用点语法 来获取和设置对象状态。