8
votes

Test de l'unité pour DealLoc avec arc dans iOS

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;
}


1 commentaires

Vous n'êtes également jamais censé appeler dealloc directement (sauf [Super Dealloc] dans dealloc ) lorsque vous n'utilisez pas Arc.


4 Réponses :


6
votes

Attribuer une instance à une variable faible: xxx

L'instance sera traitée immédiatement.

Alternativement, Vous pouvez désactiver l'arc sur votre fichier de test de l'unité et appeleralloc.


3 commentaires

Je ne vois pas comment vous pourriez écrire un test utile en utilisant une référence faible. Si ZZZ est immédiatement distribué, vous attribueriez nul en tant que délégué de ToNOObject . Donc, vous vérifiez que l'attribution no-op, pas le comportement de translocation zzz .


@chrispix c'est vrai que zzz sera attribué nil , mais arc déclenchera également un appel à mytype S-Code de fonctionnement pour annuler les effets de [[MYTYPE ALLOC] init] .


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 . 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.



3
votes

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);
}


0 commentaires

6
votes

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);
}


0 commentaires

0
votes

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) 
}


0 commentaires