XCTest - завершение цикла обработки обработчиком завершения
Я писал тесты XCode, используя XCTest
какое-то время, в основном это асинхронные тесты получателей сервиса с обработчиками завершения следующего формата без проблем:
XCTestExpectation *promise = [self expectationWithDescription:@"Get Something should succeed"];
[self.myService getSomethingOnCompletion:^(NSError * _Nullable error) {
XCTAssertNil(error, @"Error should be nil");
[promise fulfill];
}];
[self waitForExpectations:@[promise] timeout:2.0];
Внезапно сегодня я иду писать свой первый тест установщика асинхронности в следующем формате, но получаю предупреждения о XCTAssert...()
утверждение в блоке, говорящее:
Сильный захват "себя" в этом блоке может привести к сохранению цикла
XCTestExpectation *promise = [self expectationWithDescription:@"Set Something should succeed"];
[self.myService setSomething:@"..." onCompletion:^(NSError * _Nullable error) {
XCTAssertNil(error, @"Error should be nil");
[promise fulfill];
}];
[self waitForExpectations:@[promise] timeout:2.0];
Я даже пошел на то, чтобы закомментировать все содержимое setSomething: onCompletion:
такой, что он ничего не делает, очищает и перестраивает, но предупреждение все еще сохраняется.
я не понимаю, что self
это относится к тому, что единственное, что происходит внутри блока, это XCTAssert...()
а также [XCTestExpectation fulfill]
, Кроме того, я не понимаю, почему ни один из 30+ тестов, которые я написал в первом формате, не имеет связанных с ними предупреждений, но все 5+, которые я написал во втором формате, делают.
Будем благодарны за любые объяснения того, что здесь происходит и как я могу это решить.
(Используя Xcode 10.0)
Изменить 1:
Кажется, проблема связана с именем метода, setSomething: onCompletion:
, Меняя его на что-то еще, например doSomething: onCompletion:
удаляет предупреждение Я до сих пор не знаю, как / почему XCode интерпретирует set
Команда таким образом, что она представляет предупреждение, поэтому любая информация будет оценена.
Изменить 2:
Ниже приведены методы подписи setSomething
а также doSomething
:
- (void)setSomething:(EnumType)type onCompletion:(SetSomethingCompletionHandler)completion;
- (void)doSomething:(EnumType)type onCompletion:(SetSomethingCompletionHandler)completion
куда SetSomethingCompletionHandler
определяется как:
typedef void (^SetSomethingCompletionHandler)(NSError * _Nullable error);