XCTestExpectation出错:API违规 - 多次调用 - [XCTestExpectation fulfill]

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违规错误,这将帮助我避免我的应用程序中的未来运行时问题.


yoA*_*ex5 8

API 违规 - 多次调用 -[XCTestExpectation meet]

我在 set 时遇到了同样的错误expectation.expectedFulfillmentCount

expectation.assertForOverFulfill = false
Run Code Online (Sandbox Code Playgroud)

如果expectation.assertForOverFulfill = trueandfulfill()在它已经完成时被调用,那么它会抛出一个异常


Mar*_*cas 6

在 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)


Car*_*aro -1

这可能就是您正在寻找的答案:

XCTestExpectation:如何避免在等待上下文结束后调用fulfill方法?

它至少为我解决了这个问题。