我有简单的ListView,需要显示来自网络层的记录。 (应用程序的第一个屏幕)
我需要就哪种将是正确的流程获得一些意见,以便可以轻松进行单元测试用例。 (没有VIPER架构)
NetworkMgr进行网络调用并创建Model对象。
这些Model对象需要在ListTableView中填充。
我有一个完成处理程序方法来调用给出模型对象的网络请求。
func getData() {
dataMgr.requestData(url: "String") { (EmployeesArray, error) in
// print(error)
}
}
现在的问题是-当我调用ListDataTest时进行单元测试,因为ListVC在加载View时位于情节提要中,因此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
}
}
您的反馈将非常有帮助。
正确方向上的任何提示或教程都非常可取。
最佳答案
让我们尝试以MVVM
方式执行此操作。
将ViewController视为View层的一部分。
要调用网络层并将模型转换为视图模型,请引入ViewManager。
Viewcontroller将要求ViewManager提供数据(ViewModel),并将所有动作(如按下按钮)传递给ViewManager来处理业务逻辑。
这样,将很容易为ViewManager层(应该具有所有业务逻辑)编写测试用例,并且您的View不会与网络层或数据模型耦合。
关于ios - iOS Swift设计用于集成n/w层,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45844938/