J'aimerais écrire un test de l'unité iOS pour une méthode code> dealloc code> (fondamentalement) supprime l'objet en tant que délégué d'un autre objet.
- (void) dealloc { someObject.delegate = nil; }
4 Réponses :
Attribuer une instance à une variable faible: L'instance sera traitée immédiatement. p> Alternativement, Vous pouvez désactiver l'arc sur votre fichier de test de l'unité et appeleralloc. p> p>
Je ne vois pas comment vous pourriez écrire un test utile en utilisant une référence faible. Si ZZZ code> est immédiatement distribué, vous attribueriez nul en tant que délégué de
ToNOObject code>. Donc, vous vérifiez que l'attribution no-op, pas le comportement de translocation
zzz code>.
@chrispix c'est vrai que zzz code> sera attribué
nil code>, mais arc déclenchera également un appel à
mytype code> S-Code de fonctionnement pour annuler les effets de
[[MYTYPE ALLOC] init] code>.
Je comprends ça. Mon point est que de tester que la méthode dealLoc-ci-dessus nulle le délégué, vous devez pouvoir dire à un moment donné ToeObject.Delegate = ZZZ code>. Avec une référence faible, c'est toujours une mission nulle, donc quelqueobject.delegate est toujours nulle. Le test peut passer, mais cela passera également si vous commencez cette ligne dans Dealloc. Je pense que désactiver ARC sur la classe de test est le seul moyen propre de tester cela.
Vous pouvez effectivement utiliser un pool Autoréleuillet personnalisé pour tester le comportement associé à DealLoc:
- (void) testDealloc { id referencedObject = ... @autoreleasepool { id referencingObject = [ReferencingObject with:referencedObject]; ... } // dealloc has been called on referencingObject here, unless you have a memory leak XCTAssertNil(referencedObject.delegate); }
Une meilleure solution est simplement
- (void)testDealloc { __weak CLASS *weakReference; @autoreleasepool { CLASS *reference = [[CLASS alloc] init]; // or similar instance creator. weakReference = reference; // Test your magic here. [...] } // At this point the everything is working fine, the weak reference must be nil. XCTAssertNil(weakReference); }
dans Swift 5.3:
func test_myObject_dealloc() throws { weak var weakObject: MyObject? try autoreleasepool { let strongObject: MyObject = initializeMyObject(â¦) weakObject = strongObject XCTAssertNotNil(weakObject) // Perform your tests here⦠} XCTAssertNil(weakObject) }
Vous n'êtes également jamais censé appeler
dealloc code> directement (sauf
[Super Dealloc] code> dans
dealloc code>) lorsque vous n'utilisez pas Arc.