我有简单的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/

10-12 06:31