我是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类型)时它失败了。任何帮助将不胜感激!
答案 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
方法。
最后,不使用点语法进行方法调用,它不是消息表达式中括号语法的通用替代。使用点语法 来获取和设置对象状态。