Ho una configurazione piuttosto semplice per questo test dell'unità. Ho una classe che ha una proprietà delegato:Perché la proprietà del delegato debole dell'oggetto mio è nullo nei test di unità?
@interface MyClass : NSObject
...
@property (nonatomic, weak) id<MyDelegateProtocol> connectionDelegate;
...
@end
e ho impostato il delegato nel mio test:
- (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.");
}
Ma il delegato non è in realtà costituito sulla linea 3 del mio test di unità, in modo # someMethod non viene mai chiamato. Quando lo cambio in
myClassIvar.connectionDelegate = delegate;
STAssertNotNil(myClassIvar.connectionDelegate, @"delegate should not be nil");
non ci riesce. Sto usando ARC, quindi la mia impressione era che la debole proprietà fosse stata scartata. Abbastanza sicuro, cambiandolo a strong
passa il passaggio STAssertNotNil
. Ma non voglio farlo con un delegato, e non capisco perché questo faccia la differenza qui. Da quello che ho letto, tutti i riferimenti locali in ARC sono i passaggi strong
e STAssertNotNil(delegate)
. Perché la mia proprietà delegato debole è nullo quando lo stesso oggetto in una variabile locale non lo è?
+1 Ottimo, sembra di avere [l'idea giusta] (http://stackoverflow.com/a/9058542/31158) .... Grazie per aver trovato le informazioni giuste! –
Potrebbe essere utile provare il simulatore di iOS 6.0. Se il problema debole/proxy è un bug di runtime (ed è), questo potrebbe essere risolto in iOS 6.0. L'ho provato, ma non posso commentarlo (dato che è ancora sotto NDA). Ma dovresti davvero provarlo. Veramente. – Jelle