2017-08-23 20 views
1

我有簡單的ListView需要顯示來自網絡層的記錄。 (應用程序的第一個屏幕)用於集成n/w層的iOS Swift設計

我需要了解哪些是正確的流程,以便我可以輕鬆地製作單元測試用例。 (無VIPER架構)

NetworkMgr進行網絡調用並創建Model對象。

這些Model對象需要在ListTableView中填充。

我有一個完成處理程序方法來調用給出模型對象的網絡請求。

func getData() { 
dataMgr.requestData(url: "String") { (EmployeesArray, error) in 

     // print(error) 
    } 
} 

現在的問題是 - 對於單元測試時,我調用ListDataTest因爲ListVC是在故事板上加載時查看viewDidLoad方法調用,這將啓動網絡邏輯。

所以我不能僅測試UI相關的東西。

我試圖在ListDataTest類中創建一些擴展,但沒有實現成功。

下面是控制器的流程: -

===

class ListVC: UIViewController { 

var dataProvider: ListData 

override func viewDidLoad() { 
    super.viewDidLoad() 
    dataProvider.viewLoaded() 
    } 
} 

======= 在ListData類

protocol DatProviderLoad { 

func viewLoaded() 
} 

class ListData: NSObject { 


} 

extension ListData : DatProviderLoad { 

func viewLoaded() { 
    print("loaded") 
    //the network calls goes here 
    } 
} 

/- 試驗類

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 
    } 
} 

您的反饋將會非常有幫助。

任何提示或教程正確的方向將是非常可觀的。

回答

2

讓我們嘗試在MVVM的方式做到這一點。

將ViewController視爲View層的一部分。 要調用網絡層並將模型轉換爲視圖模型,請引入ViewManager。

Viewcontroller將要求ViewManager提供數據(ViewModel)並將所有操作(如按下按鈕)傳遞給ViewManager以處理業務邏輯。

通過這種方式,可以輕鬆爲ViewManager層(應該具有所有業務邏輯)編寫測試用例,並且您的View不與網絡層或數據模型結合使用。

+0

所以如果ViewMgr有getData方法。所以當應用程序。開始啓動getData調用的人員。我假設ViewMgr refr。應該存在於ViewCtr中。 – Ekra

+0

@Ekra:首選的方法是創建一個協議,並且ViewController將引用符合該協議的對象。這樣你抽象ViewManager類,但是你是正確的ViewController將有參考,並會告訴ViewManager類視圖加載。瞭解此之後,ViewManager可以啓動網絡獲取。 –

+0

感謝您的回覆。我已經更新了我的問題,請查看它 – Ekra