iOS:在Swift中使用void func进行单元测试

Cra*_*Dev 7 testing unit-testing ios swift

我想测试这个不返回值的方法,但我想检查一下是否正常.你能给我一些建议吗?

func login() {

            if Utility.feature.isAvailable(myFeat) {
                if self.helper.ifAlreadyRed() {
                    self.showWebViewController()
                } else {
                    let firstVC = FirstViewController()
                    self.setRootController(firstVC)
                }
            } else {
                let secondVC = SecondViewController()
                self.setRootController(secondVC)
            }
    }
Run Code Online (Sandbox Code Playgroud)

那么在这里应用单元测试的最佳方法是什么?

nhg*_*rif 5

测试副作用是一种方法。但是对于像有问题的代码这样的例子,我实际上更喜欢子类和期望的方法。

您的代码具有三个不同的路径。

  1. 如果功能可用并且已经是红色的,则显示 Web 视图控制器。
  2. 如果功能可用且尚未红色,则显示第一个视图控制器。
  3. 如果功能不可用,则显示第二个视图控制器。

因此,假设此login()函数是 的一部分FooViewController,一种可能性是编写遵循以下格式的测试:

func testLoginFeatureAvailableAndNotAlreadyRed() {

    class TestVC: FooViewController {
        let setRootExpectation: XCTExpectation

        init(expectation: XCTExpectation) {
            setRootExpectation = expectation
            super.init()
        }

        override func setRootController(vc: UIViewController) {
            defer { setRootExpectation.fulfill() }

            XCTAssertTrue(vc is FirstViewController)

            // TODO: Any other assertions on vc as appropriate

            // Note the lack of calling super here.  
            // Calling super would inaccurately conflate our code coverage reports
            // We're not actually asserting anything within the 
            // super implementation works as intended in this test
        }

        override func showWebViewController() {
            XCTFail("Followed wrong path.")
        }
    }

    let expectation = expectationWithDescription("Login present VC")

    let testVC = TestVC(expectation: expectation)
    testVC.loadView()
    testVC.viewDidLoad()

    // TODO: Set the state of testVC to whatever it should be
    // to expect the path we set our mock class to expect

    testVC.login()

    waitForExpectationsWithTimeout(0, handler: nil)

}
Run Code Online (Sandbox Code Playgroud)