Ich habe einfache ListView, die Datensätze von der Netzwerkebene anzeigen müssen. (erster Bildschirm der Anwendung)iOS Swift-Design für die Integration von n/w Schicht
Ich muss eine Meinung darüber bekommen, welcher Fluss korrekt sein wird, so dass ich die Einheit Testfälle leicht machen kann. (Keine VIPER-Architektur)
NetworkMgr führt die Netzwerkaufrufe durch und erstellt Model-Objekte.
Diese Model-Objekte müssen in ListTableView aufgefüllt werden.
Ich habe eine Completion-Handler-Methode, um die Netzwerkanforderung, die die Modellobjekte geben, aufzurufen.
func getData() {
dataMgr.requestData(url: "String") { (EmployeesArray, error) in
// print(error)
}
}
Nun ist die Frage - für Unit-Tests, wenn ich die ListDataTest nenne da die ListVC in Storyboard ist, wenn es die Ansicht der viewDidLoad Methode lädt ruft die, die die Netzwerklogik einleitet.
SO kann ich nicht nur die UI bezogenen Sachen zu testen.
Ich habe versucht, eine Erweiterung in ListDataTest-Klasse zu erstellen, aber kein Erfolg wird erzielt.
Unten ist der Fluss des Controller: -
===
class ListVC: UIViewController {
var dataProvider: ListData
override func viewDidLoad() {
super.viewDidLoad()
dataProvider.viewLoaded()
}
}
======= In Listdata-Klasse
protocol DatProviderLoad {
func viewLoaded()
}
class ListData: NSObject {
}
extension ListData : DatProviderLoad {
func viewLoaded() {
print("loaded")
//the network calls goes here
}
}
/- Der Test Klasse
class ListDataProviderTest: XCTestCase {
var sut: ListData!
var controller: ListVC!
override func setUp() {
super.setUp()
sut = ListData()
let storyBoard = UIStoryboard(name:"Main", bundle: nil)
controller = storyBoard.instantiateViewController(withIdentifier: "ListVC") as! ListVC
controller.dataProvider = sut //before this called the storyboard already called the viewdidload once
_ = controller.view
}
}
Ihr Feedback wird sehr hilfreich sein.
Jeder Tipp oder Tutorial in die richtige Richtung wird sehr spürbar sein.
Also, wenn ViewMgr getData Methode haben. Also wenn die App. Startet, wer den getData-Aufruf initiiert. Ich nehme den ViewMgr Refr. sollte in ViewCtr vorhanden sein. – Ekra
@Ekra: Der bevorzugte Weg besteht darin, ein Protokoll zu erstellen, und ViewController wird auf das dem Protokoll entsprechende Objekt verweisen. Auf diese Weise werden Sie die ViewManager-Klasse abstrahieren, aber ja, Sie haben Recht, der ViewController wird eine Referenz haben und der ViewManager-Klasse mitteilen, dass die Ansicht geladen ist. Der ViewManager kann, nachdem er dies erkannt hat, den Netzwerk-Abruf initiieren. –
Danke für Ihre Antwort. Ich habe meine Frage aktualisiert, bitte schauen Sie hinein – Ekra