2016-08-18 11 views
5

Chcę przetestować tę metodę, która nie zwraca wartości, ale chcę sprawdzić, czy działa poprawnie. Czy możesz dać mi jakieś sugestie?iOS: Test jednostkowy z funkcją void w 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) 
      } 
    } 

jakie jest więc najlepsze podejście do zastosowania testu jednostki tutaj?

+2

przetestować funkcje void sprawdzenie ich skutki uboczne. Test jednostki powinien zweryfikować stan przed wywołaniem, wykonać połączenie, upewnić się, że nie ma wyjątku, a następnie sprawdzić stan po zakończeniu połączenia. – dasblinkenlight

+0

czy możesz mi napisać przykład, bo na początku nie jest to dla mnie jasne – CrazyDev

Odpowiedz

3

Testowanie efektów ubocznych to jedno podejście. Ale na przykład, jak ten kod, właściwie preferuję podejście oparte na podklasie i oczekiwaniu.

Twój kod składa się z trzech różnych ścieżek.

  1. Jeśli funkcja jest dostępna i już czerwona, pokaż kontroler widoku strony.
  2. Jeśli funkcja jest dostępna i nie jest już czerwona, pokaż kontroler pierwszego widoku.
  3. Jeśli funkcja nie jest dostępna, pokaż drugi kontroler widoku.

Więc zakładając ten login() funkcji jest częścią FooViewController, jedną z możliwości jest pisanie testów, które następują formacie:

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) 

}