一段时间以来,我一直在使用XCTest
框架编写Xcode测试,大多数情况下是对服务的getter进行异步测试,并具有以下格式的完成处理程序,没有问题:
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];
今天突然我要编写以下格式的第一个异步setter测试,但是在块中的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);