Share
Embed
Transcript
16 slides
-
Dépendance • Rapports qui lient certaines choses, certains êtres, et
qui les rendent nécessaires les uns aux autres. 2 https://fr.wiktionary.org/wiki/dépendance -
Injection • Envoi d’information (requête, code, courant, tension) à une
unité de traitement https://fr.wiktionary.org/wiki/injection 3 -
Pourquoi injecter la/les dépendance(s)? • Dépendance explicite => code “plus
réutilisable” • Tests, tests, tests, tests, tests, tests, tests… • It’s all about feedback : 4 Kent Beck (@KentBeck) 25/02/15 21:31 if you get your coding feedback loop tight enough, then the time required to press cmd-S to save becomes a bottleneck #reallyContinuousTests -
Test unitaire • Objectif : vérifier le comportement d’une méthode
en particulier, d’une classe (ou d’une instance) • Mise en situation (et nettoyage) : setUp et tearDown • Trois types : • in - out • State • Behavior 5 -
Test unitaire • Bonnes pratiques : • Blocs Given /
when / expect • Variable / attribut “sut” (system under test) • nommage : testMethodeAppeleeDansWhen_doitFaireÇa 6 -
Test Driven Development Kent Beck (@KentBeck) 24/02/15 21:40 in tdd,
each test is a step forward in the problem space and making it pass is a step forward in the solution space. • Écrire le(s) test(s) avant la méthode testée (sans connaitre cette méthode, uniquement en ayant en tête le service qu’elle doit rendre (in-out)) 7 -
Pourquoi injecter la/les dépendance(s)? • Objectif : valider la sauvegarde
d’un document • ViewController dépends de DocumentManager • Créer un “FakeDocumentManager” qui “adopte” l’API du “vrai DocumentManager” • Interroger le FakeDocumentManager pour valider la sauvegarde 8 -
Comment injecter ? • Ajout d’un paramètre à la méthode
• Méthode qui retourne la dépendance + héritage/ surcharge • Lors de l’instantiation de l’objet (paramètre du constructeur) • Avec un attribut 9 -
Exemple : avec un attribut 10 @interface DocumentViewController : UIViewController
@property (nonatomic, strong) DocumentManager *documentManager; @property (nonatomic, assign) BOOL canBeEdited; @end @implementation DocumentViewController […] @end -
Exemple : avec un attribut 11 @interface FakeDocumentManager : DocumentManager
@property (nonatomic, assign) BOOL saveCalled; @end @implementation FakeDocumentManager - (void)saveDocument:(Document *)document { self.saveCalled = YES; } @end -
Exemple : avec un attribut 12 - (void)testEditAndSaveChanges_shouldSaveMagasin { //
Given FakeDocumentManager *fakeDocumentManager = [[FakeDocumentManager alloc] init]; DocumentViewController *sut = [[DocumentViewController alloc] init]; sut.canBeEdited = YES; sut.editing = YES; sut.documentManager = fakeDocumentManager; // <—— Injection // When [solo showViewControllerInCleanWindow:sut]; BOOL saveTapped = [solo waitForTappableText:@"Enregistrer" andTapIt:YES]; // Expect XCTAssertTrue(saveTapped); XCTAssertTrue(fakeDocumentManager.saveCalled); } -
Exemple : avec un attribut + OCMockito 13 - (void)testEditAndSaveChanges_shouldSaveMagasin
{ // Given Document *expectedDocumentToBeSaved = nil; // will fail DocumentManager *fakeDocumentManager = mock([DocumentManager class]); DocumentViewController *sut = [[DocumentViewController alloc] init]; sut.canBeEdited = YES; sut.editing = YES; sut.documentManager = fakeDocumentManager; // <—— Injection // When [solo showViewControllerInCleanWindow:sut]; BOOL saveTapped = [solo waitForTappableText:@"Enregistrer" andTapIt:YES]; // Expect XCTAssertTrue(saveTapped); [verify(fakeDocumentManager) saveDocument:expectedDocumentToBeSaved]; } -
Limites • Peut faire partie de l’API (publique) de l’objet
• Solution : cacher la dépendance dans une extension (ViewController+Dependencies.h) 14 -
Limites (Swift 2) • @Testable import ModuleUnderTest • et tout
ce qui est privé, ne l’est plus (classes, méthodes…) 15