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

时间:2016-08-18 23:55:25

标签: ios swift unit-testing testing

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

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

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

1 个答案:

答案 0 :(得分:4)

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

您的代码有三种不同的路径。

  1. 如果功能可用且已经是红色,请显示Web视图控制器。
  2. 如果功能可用且尚未显示红色,请显示第一个视图控制器。
  3. 如果功能不可用,请显示第二个视图控制器。
  4. 假设这个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)
    
    }