2017-08-23 1 views
1

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.

Antwort

2

Versuchen wir dies in MVVM Weg zu tun.

Think ViewController als Teil der View-Ebene. Um die Netzwerkschicht aufzurufen und Modelle in Ansichtsmodelle zu konvertieren, führen Sie einen ViewManager ein.

Der Viewcontroller fordert ViewManager auf, die Daten zur Verfügung zu stellen (ViewModel) und leitet alle Aktionen (wie Tastendruck) an ViewManager weiter, um die Geschäftslogik zu verarbeiten.

Auf diese Weise wird es einfach, Testfälle für den ViewManager-Layer (der die gesamte Geschäftslogik enthalten soll) zu schreiben, und Ihr View ist weder mit dem Netzwerk-Layer noch mit Datenmodellen gekoppelt.

+0

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

+0

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

+0

Danke für Ihre Antwort. Ich habe meine Frage aktualisiert, bitte schauen Sie hinein – Ekra