2016-09-29 9 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を、サーバと適切な手順から正常に倒されていることをテストすることができるようにしたい

が行われ、私は必ずしも完全なコードを探していませんよしかし、単に問題に近づく方法です。役に立つと思われるリソースがある場合は、感謝します。私はこれにはとても新しいので、オンラインのリソースを調べてみましたが、何も見つかりませんでした。私が見つけたことの多くは、私的な関数を直接テストしたくないということでした。テストのために関数をpublicに変更することは勧められません。

もう一度お探しください。ショーンW.

答えて

0

は同じ署名で、テストクラスでそのプライベートメソッドを定義します。そのメソッドを呼び出すと、実際のクラスメソッドが呼び出されます。

+0

したがって、テストクラスのプライベートメソッドをコピーして貼り付けますか?私が作業している2のために必要ないくつかの他のメソッドがあります。私は基本的にviewcontroller全体をテストクラスにコピーしていますか? アドバイスをいただきありがとうございます。 –

関連する問題