XCTest 中的 IOS -NSRunLoop:如何让运行循环在单元测试中工作?

Posted

技术标签:

【中文标题】XCTest 中的 IOS -NSRunLoop:如何让运行循环在单元测试中工作?【英文标题】:IOS -NSRunLoop in XCTest: How Do I Get A Run Loop to Work in A Unit Test? 【发布时间】:2013-10-22 16:03:16 【问题描述】:

好的。我环顾四周,并没有找到我的问题的确切答案。

我正在尝试在单元测试(不是主运行)中测试超时处理程序。

问题似乎是 [NSRunLoop mainRunLoop] 在单元测试中的运行方式不像在标准运行中那样运行。

我以这种方式超时:

NSTimer *pTimeoutHandler = [NSTimer 
    timerWithTimeInterval:2.0 
    target:self 
    selector:@selector(timeoutHandler:) 
    userInfo:nil 
    repeats:NO
];
[[NSRunLoop mainRunLoop] addTimer:pTimeoutHandler forMode:NSRunLoopCommonModes];

这适用于标准运行。这是设置超时的推荐方式。

但是,在测试运行中,这不起作用。永远不会调用 timeoutHandler:(NSTimer*)timer 例程。

看起来好像有东西干扰了运行循环。

有什么方法可以让我在运行和单元测试中都使用超时?

【问题讨论】:

这个帖子有帮助吗? ***.com/questions/12463733/… 【参考方案1】:

当你使用定时器和主runloop时,你需要手动运行runloop:

while (continueCondition || !time_way_over_timeout)  
    [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

其中continueCondition可能是一些标志,表示调用了超时处理程序,time_way_over_timeout是当前时间与预先计算的最大执行时间的比较(因此您可以处理“超时测试超时”你的单元测试^^)

另请参阅这篇关于异步单元测试的博文:http://dadabeatnik.wordpress.com/2013/09/12/xcode-and-asynchronous-unit-testing/

【讨论】:

链接的 wordpress 博客文章现在受到保护,需要身份验证:(【参考方案2】:

在带有 XCTest 的 Swift 3.0 中看起来像这样。

// somebody has to call the .fulfill() method on this variable 
// to the expectation will fail after 25 seconds
var asyncExpectation : XCTestExpectation!

func testExample() 
    asyncExpectation = expectation(description: "longRunningFunction")
    self.waitForExpectations(timeout: 25.0)  (error) in
        if let error = error 
            print("Error \(error)")
        
    
    // more stuff here

【讨论】:

好主意,让我阅读了 XCTestExpectation 的文档,但不是调用者要求的,而是提供不同的服务(很容易实现自己的目的)。 同意:我应该删除它还是离开它? 不要删除

以上是关于XCTest 中的 IOS -NSRunLoop:如何让运行循环在单元测试中工作?的主要内容,如果未能解决你的问题,请参考以下文章

XCTest/XCTest.h 文件未找到 XCode 5.1.1 iOS7

iOS:如何在设备上运行 XCTest?

xcrun 来自 iOS 上的 XCTest

iOS:xcode 5,将项目从 xctest 迁移到 senTestingKit

如何使用 XCTest 框架测试基于 REST 的原生 iOS 应用程序?

使用 XCTest 和单独文件进行 iOS 测试