2016-09-29 14 views
1

미리 조언 해 주셔서 감사합니다!단위 신속한 키 체인 인증이 필요한 개인 기능 테스트

iOS 개발을 위해 신속하게 단위 테스트를 설정하고 있습니다. 메서드를 성공적으로 실행하려면 authToken을 만들기 위해 키 체인을 호출해야합니다. 이런 종류의 환경에 대한 단위 테스트를 만드는 방법에 대해 확신 할 수 없습니다. 인증을 우회하는 데 사용할 수있는 로컬 파일을 모의합니까? 인증 단계를 완전히 건너 뛸려고합니까?

테스트 할 함수는 개인 함수이기도합니다. 공용 메서드를 통해 테스트 할 수있는 방법을 개념화하는 데 어려움을 겪고 있습니다.

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.setMyDoctorsNavBarTitle() 
    self.setBackgroundWaterMark() 
    self.getDoctors() 
    //self.refreshControl?.addTarget(self, action: #selector(MyDoctorsViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged) 

} 

private func getDoctors() { 
    let authToken: [String: AnyObject] = [ "Authorization": keychain["Authorization"]!, // creates an authToken with the current values stored in 
              "UUID": keychain["UUID"]!, "LifeTime": keychain["LifeTime"]! ] // the keychain 

    RestApiManager.sharedInstance.postMyDocs(authToken) { (json, statusCode) in // passes the created authToken to postMyDocs in RestAPI to see if 
     if statusCode == 200 {                    // the token matches what's on the server 
      if let results = json["Doctors"].array { // If the credentials pass, we grab the json file and create an array of Doctors 
       for entry in results { 
        self.buildDoctorObject(entry) // Doctors information is parsed into individual objects 
       } 
      } 
     } else if statusCode == 401 { 
      /* If statucCode is 401, the user's AuthToken has expired. The historical AuthToken data will be removed from the iOS KeyChain and the user will be redirected to the login screen to reauthorize with the API 
      */ 
      self.keychain["Authorization"] = nil 
      self.keychain["UUID"] = nil 
      self.keychain["LifeTime"] = nil 

      let loginController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as! LoginViewController 

      NSOperationQueue.mainQueue().addOperationWithBlock { 
       self.presentViewController(loginController, animated: true, completion: nil) 
      } 

     } else if statusCode == 503 { 
      print("Service Unavailable Please Try Again Later") 
     } 

    } 

} 

private func buildDoctorObject(json: JSON){ 
    let fName = json["FirstName"].stringValue 
    let lName = json["LastName"].stringValue 
    let city = json["City"].stringValue 
    let phNum = json["PhoneNumber"].stringValue 
    let faxNum = json["FaxNumber"].stringValue 
    let state = json["State"].stringValue 
    let addr = json["Address"].stringValue 
    let img = json["Image"].stringValue 
    let zip = json["Zip"].stringValue 
    let tax = json["Taxonomy"].stringValue 

    let docObj = DoctorObject(fName: fName, lName: lName, addr: addr, city: city, state: state, zip: zip, phNum: phNum, faxNum: faxNum, img: img, tax: tax) 

    self.docs.append(docObj) 
    self.tableView.reloadData() 
} 

내가 단위 테스트에 getDoctors 수 있어야합니다()와 buildDoctorObject는() 함수,하지만 난 단지 그들이있어 이후)의 viewDidLoad (를 통해 그 간접적으로 수행 할 수 있습니다 여기에 내가 함께 일하고 있어요 코드입니다 은밀한.

가 나는

(200) 또는 (401) 내가 반드시 완전한 코드를 찾는 게 아니에요 돌아 오는 경우에 statusCode이 서버에서 제대로 아래로 가져 와서 적절한 단계가 수행되고 있는지 테스트 할 수 있도록하려면 , 그러나 단순히 문제에 접근하는 방법. 도움이 될만한 자료를 알고 있다면 감사 할 것입니다. 나는 이것에 아주 새롭고 나는 온라인으로 자원을 조사하는 것을 시도하고 그러나 아무것도를 찾아 낼 수 없었다. 내가 발견 한 많은 것들은 개인적인 기능을 직접 테스트하고 싶지는 않지만 테스트를 위해 기능을 공개로 변경하는 것을 권장하지 않습니다.

다시 한번 살펴보고 있습니다. 숀 W.

답변

0

같은 서명, 테스트 클래스에서 그 개인 방법을 정의합니다. 이 메서드를 호출하면 실제 클래스 메서드가 호출됩니다.

+0

기본적으로 테스트 클래스에 개인 메소드를 복사하여 붙여 넣으시겠습니까? 필자가 작업하고있는 2 개의 메소드가 필요합니다. 필자는 기본적으로 전체 viewcontroller를 테스트 클래스에 복사하고 있습니까? 조언 해 주셔서 감사합니다. –