2017-01-01 2 views
1

Ich begann heute, mit dem BDD-Ansatz iOS-Komponententests zu schreiben. Ich habe eine Frage bezüglich guard Aussagen und bekommen zu 100% Code-Abdeckung.So erhalten Sie die Testabdeckung für Guard-Statement-Fall-Through

Ich habe den folgenden Code, der die Konvertierung von Data in Customer Objekte behandelt.

Als unser Backend erstellt wurde, erhielten einige Kunden nur einen Nachnamen, der ihren Vor- und Nachnamen enthielt. Deshalb ist der Vorname des Kunden optional; Ihr vollständiger Name kann der Wert für last_name sein.

In meinem Code ist der Vorname des Kunden optional, während der Nachname erforderlich ist. Wenn der Nachname im empfangenen JSON nicht von einer Netzwerkanforderung zurückgegeben wird, wird der Kunde nicht erstellt. Auch wenn der Data nicht in eine Dictionary serialisiert werden kann, wird der Kunde nicht erstellt.

Ich habe zwei JSON-Dateien, die beide Kundeninformationen enthalten, die ich zum Testen beider Szenarien verwende.

One enthält keinen Vornamen im JSON:

{ 
    "first_name": null, 
    "last_name": "Test Name", 
} 

Der andere enthält einen Vornamen im JSON:

{ 
    "first_name": "Test", 
    "last_name": "Name", 
} 

In meinem Unit-Test, mit Quick und Nimble, ich mit dem Schaffung eines Customer, wenn der erste Name ist nicht verfügbar, und wenn es:

override func spec() { 
    super.spec() 
    let bundle = Bundle(for: type(of: self)) 
    describe("customer") { 
     context("whenAllDataAvailable") { 
      it("createsSuccessfully") { 
       let path = bundle.path(forResource: "CustomerValidFullName", ofType: "json", inDirectory: "ResponseStubs")! 
       let url = URL(fileURLWithPath: path) 
       let data = try! Data(contentsOf: url) 
       let customer = DataTransformer.customer(from: data) 
       expect(customer).toNot(beNil()) 
      } 
     } 
     context("whenMissingLastName") { 
      it("createsUnsuccessfully") { 
       let path = bundle.path(forResource: "CustomerMissingLastName", ofType: "json", inDirectory: "ResponseStubs")! 
       let url = URL(fileURLWithPath: path) 
       let data = try! Data(contentsOf: url) 
       let customer = DataTransformer.customer(from: data) 
       expect(customer).to(beNil()) 
      } 
     } 
    } 
} 

Dadurch wird sichergestellt, dass ich einen Customer erzeuge, wenn der Vorname im zurückgegebenen JSON fehlt oder vorhanden ist.

Wie kann ich mit BDD eine 100% ige Codeabdeckung dieser Methode erreichen, wenn mein Code nicht die else-Klauseln der guard-Anweisungen trifft, da die Daten in gültige JSON-Objekte umgewandelt werden können? Sollte ich einfach eine weitere .json Datei mit Daten hinzufügen, die nicht in ein JSON-Objekt umgewandelt werden können, um sicherzustellen, dass eine Customer nicht erstellt wird, sowie eine .json Datei, die eine fehlende last_name enthält, um sicherzustellen, dass eine Customer nicht erstellt wird?

Überlege ich gerade das Konzept der "100% Code Coverage"? Muss ich sogar die else Klauseln der Aussagen getestet haben? Habe ich überhaupt den richtigen Ansatz mit der BDD-Methode?

Antwort

1

Schreiben Sie einfach JSON, was Sie wollen - in jeder Hinsicht falsch geschrieben. Beispiele:

  • Sie können Ihre Ausnahmebehandlung mit etwas, das JSON nicht richtig ist, treffen.
  • Sie können Ihre erste guard mit etwas, das ein JSON-Array, kein Wörterbuch ist.

Wie das Sprichwort sagt, müssen Sie nur Code abdecken, der korrekt sein soll.

TDD und BDD sind verwandt.In TDD würden Sie zuerst einen fehlgeschlagenen Test schreiben. Dann würden Sie Code schreiben, der diesen Test so schnell wie möglich besteht. Schließlich würden Sie Ihren Code bereinigen, um es besser zu machen. Es sieht so aus, als würden Sie nachträgliche Tests hinzufügen.

Übrigens würden Ihre Tests viel klarer sein, wenn Sie keine externen Dateien verwenden, sondern den JSON direkt in Ihre Tests einfügen. Hier ist ein Screencast, der zeigt, wie ich die Anfänge der JSON-Konvertierung mit TDD bearbeite. Der Screencast ist in Objective-C, aber die Prinzipien sind die gleichen: http://qualitycoding.org/tdd-json-parsing/

+0

@JonRein Ich schätze Ihre Einsicht! Darf ich fragen, wie Sie zu dem Schluss gekommen sind, dass ich meine Tests nach der Tat geschrieben habe? Genau das habe ich getan, aber ich bin neugierig, was dich zu dieser Schlussfolgerung gebracht hat. Ich studiere definitiv Ihre Konzepte und hoffe, ein besseres Verständnis zu bekommen. –

+0

@NickKohrn Wenn Code testgesteuert ist, können Sie keinen Code schreiben, der einem Test nicht entspricht. Sie fragen also nicht: "Ich habe einen Code, wie bedecke ich ihn?" –

Verwandte Themen