如果有人编写并运行如下测试,请使用最新版本的OCMock:
@import XCTest;
@import OCMock;
@interface TrackedObject : NSObject
@end
@implementation TrackedObject {
BOOL* _status;
}
- (instancetype)initWithStatus:(BOOL*)status {
self = [super init];
if (self != nil) {
_status = status;
}
return self;
}
- (void)dealloc {
*_status = YES;
}
@end
@interface KVOTestTests : XCTestCase
@end
@implementation KVOTestTests
- (void)testKVORetention {
id subject = OCMClassMock(NSObject.class);
BOOL deleted = NO;
@autoreleasepool {
TrackedObject* observer = [[TrackedObject alloc] initWithStatus:&deleted];
[subject addObserver:observer forKeyPath:@"description" options:NSKeyValueObservingOptionNew context:nil];
}
XCTAssertTrue(deleted);
}
@end
该测试将失败。
如果测试的第一行替换为
id subject = [[NSObject alloc] init];
测试成功。 这似乎表明,由于某种原因,在OCMock对象上调用addObserver:会以某种方式导致在观察者上保留强引用,从而阻止该对象被释放。
这导致了一个测试,该测试试图确保对象在解除分配时成功将其自身作为观察者移除。该测试过去通过了早期版本的OCMock。 可以做些什么来使模拟测试通过?
注意:所有这些都假设测试使用的是ARC。