Вызов addObserver для объекта OCMock создает сильную ссылку - PullRequest
0 голосов
/ 08 января 2019

Используя последнюю версию 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.

...