2017-02-16 5 views
1

Рассмотрим следующий тест единицы:Правильный выбор времени/размещение метода XCTest Expectation в модульных тестах?

- (void)testSample { 
    XCTestExpectation *expectation = [self expectationWithDescription:@"Sample"]; 

    [self.manager loadAllSuccess:^{ 
     [expectation fulfill]; 

     NSArray *data = [self.manager dataForIndex:0]; 

     // Correct count of data is 10, not 44 - this should fail. 
     XCTAssertEqual(44, data.count); 
    } failure:^(NSError *error) { 
     [expectation fulfill]; 

     XCTFail(@"Error encountered"); 
    }]; 

    [self waitForExpectationsWithTimeout:60 handler:nil]; 
} 

Я встречая некоторые проблемы с известного случая отказа. Тест успешно завершается, несмотря на то, что в массиве данных должно быть только 10 элементов.

Если я поставил [expectation fulfill] вызов в нижней части блока, после вызова метода XCTAssertEqual(44, data.count), тест работает, как ожидалось и не пока не исправите значение будет 10.

Это известная проблема? Я был не в состоянии прочитать документацию о том, что я должен называть, что в последнюю минуту ...

+0

Всегда вызывайте функцию execute() в конце асинхронного обратного вызова - выполнение ожиданий ранее может установить условие гонки, когда цикл выполнения может выйти до завершения теста. Если тест имеет более одного ожидания, он не пройдет, если каждое ожидание не выполнит выполнение() в течение таймаута, указанного в waitForExpectationsWithTimeout(). Нашли это по адресу http://nshipster.com/xctestcase/ – Zach

ответ

2

Согласно http://nshipster.com/xctestcase/

Всегда вызывайте выполнить() в конце асинхронного callback- выполняя ожидаемое ранее, может установить условие , в котором цикл выполнения может выйти до завершения теста. Если тест имеет более одного ожидания, он не пройдет, если каждое ожидание не выполнит выполнение() в течение таймаута, указанного в waitForExpectationsWithTimeout().

Только что нашел это - не уверен, что он на 100% точным, хотя я не вижу никакой другой документации, в которой говорится об этом в другом месте.

0

Да, вы должны позвонить по номеру fulfill, когда ваши ожидания будут выполнены. Если вы ожидаете, что ваши утверждения будут выполнены до окончания теста, вы должны выполнить свое ожидание только после того, как будет выполнено утверждение.

Как говорится в ответе Заха Заха, ссылаясь на NSHipster, вполне возможно, что тест прекратит выполнение до того, как ваши блоки успеха/отказа закончатся, потому что единственное, что ждет тест, - это выполнение ожиданий. Блоки успеха и отказа выполняются без знания теста. Как только ожидание будет выполнено, выполнение теста остановится, и любой дополнительный код не будет выполнен.

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