2017-09-29 85 views
1

我有许多异步单元测试可以根据自己的期望正确工作。但是,当我在诉讼中运行所有测试时,他们不会等待其他人完成 - 异步回调在下次测试开始运行时仍处于等待状态。我想要的是每次测试都要在运行前等待前一次测试中的预期。这些测试使用共享数据库,因此让它们重叠会导致烦人的额外复杂性,并在作为套件运行时出现测试失败。在XCode开始下一个单元测试之前等待XCTestExpectation

- (void)testSignIn { 
// This is an example of a functional test case. 
// Use XCTAssert and related functions to verify your tests produce the correct results. 

XCTestExpectation *expectation = 
[self expectationWithDescription:@"Expectations"]; 

[_userManager signInWithUsername:kUserEmail andPassword:kUserPassword 
         success:^{ 
          XCTAssertNotNil([_userManager getCurrentUser]); 

          XCTAssertNotNil([_userManager getCurrentUser].plan); 
          XCTAssertTrue([_userManager getCurrentUser].plan.liveStream == TRUE); 

          [expectation fulfill]; 

         } failure:^(EDApiError *apiError) { 
          XCTAssertTrue(FALSE); // Should not fail 
          [expectation fulfill]; 

         }]; 

[self waitForExpectationsWithTimeout:5.0 handler:^(NSError *error) { 
    if (error) { 
     NSLog(@"Timeout Error: %@", error); 
    } 
}]; 

}

+0

这没有任何意义,一次测试在开始下一次测试之前应该失败/成功,这两种方法都必须满足期望。我能想到的唯一的事情就是从单个测试的2个地方调用'testSignIn'。所以请确保你没有从一次测试中运行两次。 2.另外5秒超时有点太少。我会建议至少30秒。 – Honey

+1

看起来像期望需要有不同的描述字符串。我把所有的我都设置为相同的字符串,这似乎导致了我所看到的行为。 – deepwinter

+0

(删除了我以前的评论)我试图理解这一点。我的意思是仍然没有2个测试同时运行。所以,尽管这有效,但我猜这不是根本原因... – Honey

回答

0

使用XCTWaiterwaitForExpectations(timeout:handler:)来搪塞每个测试的完成,直到预期已经兑现。

本博客文章解释了一些更复杂的陷阱,你可能会遇到编写异步测试时,如何防止他们:https://jeremywsherman.com/blog/2016/03/19/xctestexpectation-gotchas/

+0

查看我上面更新的问题。我正在使用waitForExpectation,但测试看起来并没有拖延完成,只要继续进行下一个测试,然后在自己的时间内完成(无论成功还是失败),只要在超时时间内完成即可。 – deepwinter

0

我找到了你需要满足在主线程的预期 - 如果你很重要异步完成块可能正在另一个线程上运行。我还发现,问题可能由更早运行的错误测试触发,因此并不总是由测试失败导致的。

另外,请注意是否产生大量异步块(我这样做是为了进行疯狂的线程安全测试,或者检查独占访问资源的测试是否按预期工作,并按照预期的顺序进行)。一旦你满足了期望,测试就进入下一个测试阶段,但是如果你在那之后发射了很多异步块,他们可能还在运行。

相关问题