2016-09-29 14 views
1

Заранее благодарим за любой совет!Модуль Тестирование частных функций, для которых требуется проверка подлинности в цепочке ключей в swift

Я устанавливаю некоторые модульные тесты в быстрой разработке 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(), так как они частный.

Я хочу, чтобы иметь возможность проверить, что StatusCode приносится вниз правильно с сервера и соответствующие шаги иметь место, если он возвращается как 200 или 401.

Я не обязательно ищет полный код , а просто способ подойти к проблеме. Если вы знаете ресурсы, которые могут быть полезны, я был бы благодарен. Я очень новичок в этом, и я пробовал искать ресурсы в Интернете, но ничего не мог найти. Многое из того, что я нашел, это то, что вы не хотите напрямую проверять частные функции и не рекомендуется изменять функции для общественности ради тестирования.

Еще раз спасибо за внимание!

Sean W.

ответ

0

Определить, что частный метод в классе Test, с той же подписью. Просто попробуйте вызвать этот метод, который он вызовет ваш метод фактического класса.

+0

Итак, по существу, скопируйте и вставьте этот частный метод в класс тестирования? Есть несколько других методов, которые необходимы для 2, над которыми я работаю, по существу ли я копирую весь контроллер представления в тестовый класс? Спасибо за совет! –