アドバイスを事前にお寄せいただきありがとうございます!ユニット迅速なキーチェーン認証が必要なプライベート機能のテスト
私は、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.
したがって、テストクラスのプライベートメソッドをコピーして貼り付けますか?私が作業している2のために必要ないくつかの他のメソッドがあります。私は基本的にviewcontroller全体をテストクラスにコピーしていますか? アドバイスをいただきありがとうございます。 –