问题是您试图在测试用例中找到的单元格,即带有标签“这是单元格 19”的单元格,直到集合视图已经滚动后才存在。所以我们需要先让视图滚动,然后再寻找单元格。使用 Subliminal 使集合视图滚动的最简单方法是通过应用程序挂钩。在(例如)您的视图控制器的viewDidLoad
方法中,您可以注册视图控制器以响应来自任何 Subliminal 测试用例的特定消息,如下所示:
[[SLTestController sharedTestController] registerTarget:self forAction:@selector(scrollToBottom)];
并且视图控制器可以将该方法实现为:
- (void)scrollToBottom {
[self.collectionView setContentOffset:CGPointMake(0.0, 1774.0)];
}
这1774
只是将测试应用程序中的集合视图一直滚动到底部时发生的偏移量。在实际应用程序中,应用程序挂钩可能会更复杂。(在实际应用程序中,您需要确保调用[[SLTestController sharedTestController] deregisterTarget:self]
视图控制器的dealloc
方法。)
scrollToBottom
要从潜意识测试用例触发方法,您可以使用:
[[SLTestController sharedTestController] sendAction:@selector(scrollToBottom)];
或便利宏:
SLAskApp(scrollToBottom);
共享SLTestController
将scrollToBottom
消息发送到注册接收它的对象(您的视图控制器)。
当sendAction
orSLAskApp
宏返回时,您的单元格 19 已经可见,因此您无需再为[lastLabel scrollToVisible]
调用而烦恼。您的完整测试用例可能如下所示:
- (void)testScrollingCase {
SLElement *label1 = [SLElement elementWithAccessibilityLabel:@"This is cell 0"];
SLAssertTrue([UIAElement(label1) isVisible], @"Cell 0 should be visible at this point");
SLElement *label5 = [SLElement elementWithAccessibilityLabel:@"This is cell 5"];
SLAssertFalse([UIAElement(label5) isValid], @"Cell 5 should not be visible at this point");
// Cause the collection view to scroll to the bottom.
SLAskApp(scrollToBottom);
SLElement *lastLabel = [SLElement elementWithAccessibilityLabel:@"This is cell 19"];
SLAssertTrue([UIAElement(lastLabel) isVisible], @"Last cell should be visible at this point");
}