Mih*_*hir 23 unit-testing asynchronous xctest xcode6 ios8
我在Xcode 6(Beta 5)中使用XCTestExpectations进行异步测试.我每次运行时都会单独传递所有异步测试.但是,当我尝试运行我的整个套件时,一些测试没有通过,应用程序崩溃了.
我得到的错误是说API violation - multiple calls made to -[XCTestExpectation fulfill].实际上,在单一方法中并非如此; 我测试的一般格式如下所示:
- (void) someTest {
/* Declare Expectation */
XCTestExpectation *expectation = [self expectationWithDescription:@"My Expectation"];
[MyClass loginOnServerWithEmail:@"example@email.com" andPassword:@"asdfasdf" onSuccess:^void(User *user) {
/* Make some assertions here about the object that was given. */
/* Fulfill the expectation */
[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:5.0 handler:^(NSError *error) {
/* Error handling here */
}];
}
Run Code Online (Sandbox Code Playgroud)
同样,这些测试确实在单独运行时通过,并且它们实际上正在发出网络请求(完全按预期工作),但是一起,测试集合无法运行.
我能够在这里查看这篇文章,但无法让解决方案为我工作.
另外,我正在运行OSX Mavericks并使用Xcode 6(Beta 5).
小智 15
我不认为使用__weak或是__block一种好方法.我已经写了很多单元测试使用XCTestExpectation了一段时间,直到现在才遇到这个问题.我终于发现问题的真正原因可能导致我的应用程序中的错误.我的问题的根本原因是startAsynchronousTaskWithDuration多次调用completionHandler.修复后,API违规消失了!
[self startAsynchronousTaskWithDuration:4 completionHandler:^(id result, NSError *error) {
XCTAssertNotNil(result);
XCTAssertNil(error);
[expectation fulfill];
}];
Run Code Online (Sandbox Code Playgroud)
虽然我花了几个小时来修复我的单元测试,但我开始意识到API违规错误,这将帮助我避免我的应用程序中的未来运行时问题.
API 违规 - 多次调用 -[XCTestExpectation meet]
我在 set 时遇到了同样的错误expectation.expectedFulfillmentCount。
expectation.assertForOverFulfill = false
Run Code Online (Sandbox Code Playgroud)
如果expectation.assertForOverFulfill = trueandfulfill()在它已经完成时被调用,那么它会抛出一个异常
在 Xcode 12.5 / Swift 5 上有同样的问题。
检查您是否没有覆盖setUp 和tearDown 'class' 方法。
它应该是:
override func setUp()
override func tearDown()
Run Code Online (Sandbox Code Playgroud)
代替:
override class func setUp()
override class func tearDown()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8471 次 |
| 最近记录: |