XCTest и асинхронное тестирование в Xcode 6

Поэтому Apple сообщила в примечании к выпуску Xcode 6, что теперь мы можем проводить асинхронное тестирование напрямую с помощью XCTest.

Кто-нибудь знает, как это сделать с помощью Xcode 6 Beta 3 (с использованием Objective-C или Swift)? Мне нужен не известный метод семафора, а новый способ Apple.

Я искал выпущенную заметку и многое другое, но ничего не нашел. Заголовок XCTest также не очень явный.


person Dimillian    schedule 11.07.2014    source источник


Ответы (4)


Пример Obj-C:

- (void)testAsyncMethod
{

    //Expectation
    XCTestExpectation *expectation = [self expectationWithDescription:@"Testing Async Method Works!"];

    [MyClass asyncMethodWithCompletionBlock:^(NSError *error, NSHTTPURLResponse *httpResponse, NSData *data) {

        if(error)
        {
            NSLog(@"error is: %@", error);
        }else{
            NSInteger statusCode = [httpResponse statusCode];
            XCTAssertEqual(statusCode, 200);
            [expectation fulfill];
        }

    }];


    [self waitForExpectationsWithTimeout:5.0 handler:^(NSError *error) {

        if(error)
        {
            XCTFail(@"Expectation Failed with error: %@", error);
        }

    }];
}
person jonbauer    schedule 19.09.2014
comment
глупый вопрос: что, если мой asyncMethod не имеет блока завершения? Я понятия не имею, как это проверить. - person 最白目; 17.11.2015
comment
Предполагая, что вы запускаете его в dispatch_queue, вы можете запланировать свой тест в той же очереди после того, как вы начали работу, которую планировали. Просто отправьте_async в ту же очередь, а затем в этом блоке продолжения сделайте то, что вам нужно. - person Bob9630; 08.03.2016

Видео сеансов идеально, в основном вы хотите сделать что-то вроде этого

func testFetchNews() {
    let expectation = self.expectationWithDescription("fetch posts")

    Post.fetch(.Top, completion: {(posts: [Post]!, error: Fetcher.ResponseError!) in
        XCTAssert(true, "Pass")
        expectation.fulfill()
    })

    self.waitForExpectationsWithTimeout(5.0, handler: nil)
}
person Dimillian    schedule 11.07.2014


Как я делал в swift2

Шаг 1: определите ожидания

let expectation = self.expectationWithDescription("get result bla bla")

Шаг 2: скажите тесту оправдать ожидания прямо под тем местом, где вы фиксируете ответ

responseThatIGotFromAsyncRequest = response.result.value
expectation.fulfill()

Шаг 3: Скажите тесту подождать, пока ожидание не оправдается

waitForExpectationsWithTimeout(10)

ШАГ 4: сделайте утверждение после завершения асинхронного вызова

XCTAssertEqual(responseThatIGotFromAsyncRequest, expectedResponse)
person Ankit Vij    schedule 02.03.2016