使用 KIF 测试异步 UITableView

Posted

技术标签:

【中文标题】使用 KIF 测试异步 UITableView【英文标题】:Testing Asynchronous UITableView with KIF 【发布时间】:2012-01-12 21:57:19 【问题描述】:

我开始使用 KIF,但在使用当前配置测试异步加载的表视图时遇到问题。

我的应用中有一个带有按钮的主屏幕。当按下该按钮时,会出现一个模态视图控制器。

- (void)viewDidLoad

    [super viewDidLoad];

    // Setup accessibility
    self.theTableView.accessibilityLabel = @"My List";

    // Register for notifications
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(objectsLoadedNotification:) name:kNotificationObjectsLoaded object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(objectsFailedToLoadNotification:) name:kNotificationObjectsFailedToLoad object:nil];

    // Start loading new data
    [[MyListObjectManager sharedInstance] requestObjects];

现在,我在 KIF 中设置了一个测试,如下所示:

+ (id)scenarioToSelecList

    KIFTestScenario *scenario = [KIFTestScenario scenarioWithDescription:@"Test that a user can select an item from my list."];

    [scenario addStep:[KIFTestStep stepToTapViewWithAccessibilityLabel:@"List"]];
    [scenario addStep:[KIFTestStep stepToWaitForNotificationName:kNotificationObjectsLoaded object:nil]];
    [scenario addStep:[KIFTestStep stepToTapRowInTableViewWithAccessibilityLabel:@"My List" atIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]];

当我运行测试时,KIF 从来没有看到我的对象加载通知。

在调试中,我将 viewDidLoad 方法中的 [objectManager requestObjects] 调用替换为三秒后请求对象的异步调用:

[[MyListObjectManager sharedInstance] performSelector:@selector(requestObjects) withObject:nil afterDelay:3.0];

执行此操作时,我在 KIF 输出中看到以下内容:

PASS (0.90s): Tap view with accessibility label "Find Books"
PASS (3.02s): Wait for notification "notificationObjectsLoaded"

这让我相信最初的问题是我正在等待的通知在第一步完成执行之前被触发。

那么,问题就变成了,为什么第一步需要 0.9 秒才能完成?是否在从步骤返回之前等待模态动画完成?在这种情况下,加载对象的请求比动画完成得更快。

KIF 应该如何处理?还是有更合适的为我的 tableview 加载异步数据的不同方法?

【问题讨论】:

【参考方案1】:

您的怀疑可能是正确的,通知是在您运行侦听它的步骤之前触发的,但我在您的输出中注意到该步骤成功

在任何情况下,如果您将项目加载到表格视图中,您点击其中一个的步骤将等到其加载超时 - 您可以更改该超时。如果您删除完全等待通知的步骤,您可能会发现您的测试工作正常。

【讨论】:

谢谢 - 有问题的步骤成功了 b/c 我添加了 3 秒的等待时间来加载。但是,现在已经无关紧要了……您完全正确!我没有意识到点击一行的步骤会等到表格被填充(在超时内)。我已经将等待通知的步骤替换为等待表格可见的步骤,但它不能完美地工作,等到行被填充以点击它。谢谢你,吉姆!!!

以上是关于使用 KIF 测试异步 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

iOS KIF 测试失败

使用 Kif 进行 Swift UI 测试

windowsWithKeyWindow 中的 NSInvalidArgumentException 从 XCODE 运行 KIF 测试

关于如何使用 KIF 测试实现拉取刷新的任何想法?

如何使用 KIF 测试空表?

当使用 KIF 测试框架 UIButton 不适用于 UIControlEventTouchUpInside