У меня довольно простая настройка для этого модульного теста. У меня есть класс, который имеет свойство делегата:
@interface MyClass : NSObject
...
@property (nonatomic, weak) id<MyDelegateProtocol> connectionDelegate;
...
@end
и я установил делегата в моем тесте:
- (void)testMyMethod_WithDelegate {
id delegate = mockDelegateHelper(); // uses OCMock to create a mock object
[[delegate expect] someMethod];
myClassIvar.connectionDelegate = delegate;
[myClass someOtherMethod];
STAssertNoThrow([delegate verify], @"should have called someMethod on delegate.");
}
Но делегат на самом деле не указан в строке 3 моего модульного теста, поэтому никогда не вызывается #someMethod. Когда я изменяю это на
myClassIvar.connectionDelegate = delegate;
STAssertNotNil(myClassIvar.connectionDelegate, @"delegate should not be nil");
это терпит неудачу там. Я использую ARC, так что я догадывался, что слабая собственность была освобождена. Конечно же, изменение его на strong
делает проход STAssertNotNil
. Но я не хочу делать это с делегатом, и я не понимаю, почему это имеет значение здесь. Из того, что я прочитал, все локальные ссылки в ARC strong
и STAssertNotNil(delegate)
проходят. Почему мое слабое свойство делегата равно nil, если того же объекта в локальной переменной нет?