XCTest完成处理程序断言保留周期

时间:2018-10-11 13:47:46

标签: xctest xctestcase xctestexpectation

一段时间以来,我一直在使用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:

以下是setSomethingdoSomething的方法签名:

- (void)setSomething:(EnumType)type onCompletion:(SetSomethingCompletionHandler)completion;
- (void)doSomething:(EnumType)type onCompletion:(SetSomethingCompletionHandler)completion

SetSomethingCompletionHandler定义为:

typedef void (^SetSomethingCompletionHandler)(NSError * _Nullable error);

0 个答案:

没有答案