XCTest - завершение цикла обработки обработчиком завершения - PullRequest
0 голосов
/ 11 октября 2018

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