如何单元测试`viewDidLoad()`

Mir*_*rek 0 dependency-injection uiviewcontroller ios xctest swift

UIViewController.viewDidLoad()在 iOS 上的单元测试方法时,每个人最喜欢的注入依赖项的方式是什么?

鉴于我的实现是:

class MyViewController: UIViewController {

    var service: Service = Service()

    override func viewDidLoad() {
        super.viewDidLoad()
        service.load()
    }
}
Run Code Online (Sandbox Code Playgroud)

我的测试课是这样的:

class MyViewController Tests: XCTestCase {

     var vc: MyViewController!
     var serviceMock = ServiceMock()

    override func setUp() {
       super.setUp()
       let storyboard = UIStoryboard(name: "Main", bundle: nil)
       vc = storyboard.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController
       vc.service = serviceMock
    }
}

func testThatServiceIsCalled() {

       XCTAssertTrue(serviceMock.loadCalled)
 }
Run Code Online (Sandbox Code Playgroud)

这里明显的问题是viewDidLoad()在我实例化 viewController 的那一刻被调用,并且测试失败,因为模拟没有正确注入。

有什么解决办法吗?

Joa*_*son 5

为什么需要使用storyboard来创建视图控制器?

这行不通?

func testThatServiceIsCalled() {
  let vc = MyViewController()
  vc.service = serviceMock
  vc.viewDidLoad()

  XCTAssertTrue(serviceMock.loadCalled)
}
Run Code Online (Sandbox Code Playgroud)