在OCMock对象上调用addObserver创建强大的参考

时间:2019-01-08 20:09:57

标签: ocmock

如果有人编写并运行如下测试,请使用最新版本的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。

0 个答案:

没有答案