【问题标题】:Delay the execution of all unit tests in XCTest延迟 XCTest 中所有单元测试的执行
【发布时间】:2017-01-08 09:56:05
【问题描述】:

我需要我的单元测试来等待我们的子系统初始化,这通常需要几秒钟。为了等待这个,我可以在测试中执行以下操作

- (void)testReverseActionWithOffset
{
    XCTestExpectation *expectation = [self expectationWithDescription:@"High Expectations"];

    // Wait for proper initialization of Realm and CrimsonObject system...
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{

问题是,使用这种技术,我必须在每一个测试方法中都等待。这导致即使在系统启动后,每次测试之间也会有两秒的延迟。因为测试方法以未确定的顺序运行,所以我不能只将延迟放在一种方法上。在 XCTest 下处理这个问题的正确方法是什么?

【问题讨论】:

    标签: objective-c unit-testing testing xctest


    【解决方案1】:

    因为测试方法以未确定的顺序运行,我不能把延迟放在一个方法上

    任何需要在每个测试之间完成的事情都可以在-setUp-tearDown 中完成。

    如果您需要对每个XCTestCase 执行一次操作,您可以使用+setUp+tearDown 中的任一类方法。第一次在运行任何测试之前运行,后者在所有测试之后运行。

    您可以通过旋转运行循环在任何这些方法中进行非阻塞等待:

    + (void)setUp
    {
        while( /* subsystems not ready */ ){
            [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
        }
    }
    

    【讨论】:

    • 问题是,据我在测试中看到的,没有办法延迟使用这些方法。期望似乎没有产生效果,如果你把 sleep() 弄平,它会延迟主线程,所以我的加载不会初始化(这是我首先等待的)。如果您知道解决此问题的方法,请告诉我。谢谢!
    • 要进行非阻塞等待,您可以旋转运行循环直到满足您的条件:while( /* subsystems not ready */ ) { [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; } 我应该注意到,我不禁觉得我正在回答您的问题解决问题的费用。我不太确定这里的真正正确答案是什么。
    • 没有意识到您可以从线程内继续主线程!这很好用。您可以将此添加到答案中,我会接受吗? + (void)setUp { while() { [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1f]]; } }
    • nm 在那个请求上!没有意识到我有权编辑其他人的答案。感谢您的帮助!
    • 很高兴我能帮上忙。关于您的代码的一个小注释:NSTimeIntervaldouble,而不是 float。在这种情况下,f 后缀不正确。
    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2017-02-22
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多