8

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

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

问题似乎[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例程永远不会被调用。

看起来好像有什么东西在干扰运行循环。

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

4

2 回答 2

10

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

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/

于 2013-10-22T16:27:05.203 回答
1

在带有 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
}
于 2017-02-22T05:36:13.470 回答