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?
@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. –
@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?" –