Используя последнюю версию 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];
Тест пройден успешно.
Похоже, это указывает на то, что по какой-то причине вызов addObserver: для объекта OCMock каким-то образом вызывает сильную ссылку на наблюдателя, которая препятствует его освобождению.
Это вызывает тест, который пытался убедиться, что объект удалялся как наблюдатель, когда он был освобожден, от успеха. Этот тест раньше проходил в более ранних версиях OCMock.
Что можно сделать, чтобы такой тест прошел, используя макет?
Примечание: все это предполагает, что в тесте используется ARC.