injection-dependance-objc

Bcf731fa27a91479e80c9f9407998f9f?s=47 kenji
March 01, 2016

 injection-dependance-objc

Bcf731fa27a91479e80c9f9407998f9f?s=128

kenji

March 01, 2016
Tweet

Transcript

  1. 2.

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

    Injection • Envoi d’information (requête, code, courant, tension) à une

    unité de traitement https://fr.wiktionary.org/wiki/injection 3
  3. 4.

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

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

    Test unitaire • Bonnes pratiques : • Blocs Given /

    when / expect • Variable / attribut “sut” (system under test) • nommage : testMethodeAppeleeDansWhen_doitFaireÇa 6
  6. 7.

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

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

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

    Exemple : avec un attribut 10 @interface DocumentViewController : UIViewController

    @property (nonatomic, strong) DocumentManager *documentManager; @property (nonatomic, assign) BOOL canBeEdited; @end @implementation DocumentViewController […] @end
  10. 11.

    Exemple : avec un attribut 11 @interface FakeDocumentManager : DocumentManager

    @property (nonatomic, assign) BOOL saveCalled; @end @implementation FakeDocumentManager - (void)saveDocument:(Document *)document { self.saveCalled = YES; } @end
  11. 12.

    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); }
  12. 13.

    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]; }
  13. 14.

    Limites • Peut faire partie de l’API (publique) de l’objet

    • Solution : cacher la dépendance dans une extension (ViewController+Dependencies.h) 14
  14. 15.

    Limites (Swift 2) • @Testable import ModuleUnderTest • et tout

    ce qui est privé, ne l’est plus (classes, méthodes…) 15