我目前正在尝试用于iOS集成测试的KIF和Subliminal.但我仍然无法弄清楚如何使用两个框架模拟表视图或集合视图上的滚动.就像滚动到表视图或集合视图的底部一样.
编辑1:
我在这里制作了简单的单一集合视图应用https://github.com/nicnocquee/TestSubliminal
基本上我想测试最后一个单元格的标签.我不能做
SLElement *lastLabel = [SLElement elementWithAccessibilityLabel:@"Label of the last cell"];
[lastLabel scrollToVisible];
因为标签在集合视图滚动到底部之前还不存在.
编辑2:
我把Aaron的答案标记为答案.但杰弗里也有效:)
最佳答案 问题是您在测试用例中尝试查找的单元格,标签为“This is cell 19”的单元格,在集合视图已滚动之前不存在.所以我们需要首先进行视图滚动,然后查找单元格.使用Subliminal进行集合视图滚动的最简单方法是通过应用程序挂钩.在(例如)视图控制器的viewDidLoad方法中,您可以注册视图控制器以响应来自任何Subliminal测试用例的特定消息,如下所示:
[[SLTestController sharedTestController] registerTarget:self forAction:@selector(scrollToBottom)];
并且视图控制器可以将该方法实现为:
- (void)scrollToBottom {
[self.collectionView setContentOffset:CGPointMake(0.0, 1774.0)];
}
1774就是将测试应用程序中的集合视图一直滚动到底部的偏移量.在实际的应用程序中,app钩子可能会更复杂. (在实际应用程序中,您需要确保在视图控制器的dealloc方法中调用[[SLTestController sharedTestController] deregisterTarget:self].)
要从Subliminal测试用例中触发scrollToBottom方法,您可以使用:
[[SLTestController sharedTestController] sendAction:@selector(scrollToBottom)];
或便利宏:
SLAskApp(scrollToBottom);
共享SLTestController将scrollToBottom消息发送到注册接收它的对象(您的视图控制器).
当sendAction或SLAskApp宏返回时,您的单元格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");
}