单元测试 IBOutlet 的属性
Posted
技术标签:
【中文标题】单元测试 IBOutlet 的属性【英文标题】:Unit testing IBOutlet's properties 【发布时间】:2013-08-23 06:15:39 【问题描述】:我使用GHUnit
。我要测试IBOutlet
的属性如isHidden
、delegate
等
我尝试了下面的代码来测试 myView
是否被隐藏:
- (void)testViewDidLoad
// Call view on viewcontroller which will load the view if not loaded
[testClass view];
// Tests
testClass.myView.hidden = YES;
if (testClass.myView.isHidden)
GHTestLog(@"Hidden");
else
GHTestLog(@"Not Hidden");
这总是记录Not Hidden
,而在记录之前我将它设置为hidden = YES
。
这是为什么?
为了测试IBOutlet
的delegate
属性,我尝试了以下行:
GHAssertNotNil(testClass.textField.delegate, @"delegate is nil.");
Reason : ((testClass.textField.delegate) != nil) should be FALSE.
失败
怎么了?
编辑: 尝试了下面的代码,但不起作用。
[testClass view];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle:[NSBundle bundleForClass:[self class]]];
GHAssertNotNil(storyboard, nil);
// Tests
GHAssertTrue(testClass.myView.isHidden, nil); // This fails
【问题讨论】:
你有验证testClass.myView
不为零的测试吗?
@FlorianMielke 你是对的。 myView
为零。但是当我调用[testClass view];
时,它不应该被初始化吗?或者有什么方法可以初始化?重点是 IBOutlet
和 weak
属性。
您使用的是XIB还是故事板作为界面?
@FlorianMielke 故事板。
【参考方案1】:
在测试 UIStoryboard
中包含的视图时,请确保您已将情节提要文件添加到测试目标中。
我还建议您进行一个测试来验证您的故事板是否已成功初始化,如下所示:
- (void)testStoryboardShouldBeInitialized
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"NameOfStoryboard" bundle:[NSBundle bundleForClass:[self class]]];
STAssertNotNil(storyboard, nil);
编辑
您首先必须从情节提要中实例化您想要测试的视图控制器,然后您可以测试您的插座:
UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"ViewControllerIdentifier"];
[controller view];
GHAssertTrue(controller.myView.isHidden, nil);
我还建议测试(以单独的方法)您的视图控制器是否已成功实例化。如果需要,我还将控制器初始化移到您的 setUp 方法中。
【讨论】:
试过了。不工作。我已经发布了我尝试过的确切代码。【参考方案2】:这是因为界面生成器上的 IBTextField 无法找到已定义的文本字段属性。
也就是说,您需要从界面构建器将其附加或将文本字段连接到其属性。
(或者可能是因为您的testClass
无法指向或授予对textField
的访问权限。)
【讨论】:
以上是关于单元测试 IBOutlet 的属性的主要内容,如果未能解决你的问题,请参考以下文章