Я уже некоторое время пишу тесты 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);