2016-02-02 3 views
6

У меня есть код Swift 2 с использованием Alamofire, который запрашивает удаленный URL-адрес, который он ожидает вернуть JSON. Я сделал достаточно интерактивного тестирования, чтобы быть достаточно уверенным, что он ведет себя достаточно правильно. Теперь я хочу выполнить его тестирование, чтобы я мог полагаться на этот код, а затем переходить на другие вещи.Как мне высмеять ответ Alamofire?

Я новичок в Swift, хотя я программировал OO Perl в течение десятилетий, поэтому, возможно, кое-что, что я пропустил.

Вот как я установил контрольный код до сих пор (несущественные вещи, такие как, как я получаю имя пользователя и пароль, удаленные, чтобы избежать як-бритья). Вызывающий код указывает имя пользователя и пароль и ожидает, что один из двух обратных вызовов будет вызываться всякий раз, когда будет получен результат. (Я не получил, насколько дело с ошибками, так что пожалуйста, не отвлекаться на эту тему.)

struct checkUsernameHandler { 
    var onSuccess:() ->() 
    var onFailure:() ->() 
} 
struct checkUsernameOutput { 
    var authenticated: Bool? 
} 

func checkUsername(user: User, handler: checkUsernameHandler) { 
    Alamofire.request(.PUT, NSURL(string: baseURL + "/user/verify?key=" + apiKey)!, 
     parameters: [ 
      "username": user.username!, 
      "password": user.password!, 
     ], 
     encoding: .JSON 
    ).responseJSON { response in 
     let checkusernameOutput = self.analyseCheckUsernameResponse(response) 
     if let authenticated = checkusernameOutput.authenticated { 
      if authenticated { 
       handler.onSuccess() 
      } else { 
       handler.onFailure() 
      } 
     } 
    } 
} 

func analyseCheckUsernameResponse (response: Response<AnyObject, NSError>) -> checkUsernameOutput { 
    var output = checkUsernameOutput() 
    if (response.result.isSuccess) { 
     if let JSON = response.result.value as? NSDictionary { 
      // ... 
     } 
    } else { 
     print("Didn't get proper JSON or something: \(response.result.error)") 
    } 
    return output 
} 

Что я ищу способ взять сырой JSON и передать его в Alamofire, так что я могу создать объект ответа, который имеет в нем соответствующие вещи, включая ошибки, если он ничего не получил (тайм-аут?) или возвращенные данные были недопустимыми (например, HTML-формат 404 или 500 страниц).

Я счастлив на данный момент с функцией checkUsername, поэтому мне неинтересно, что кто-то говорит «используйте OHHTTPStubs». Я смотрю на тестирование только кода, о котором я сомневаюсь, это код, который я только что написал.

EDIT: После faffed о некоторых более, это выглядит как внутреннее Alamofire в достаточной степени связаны, что создать поддельный ответ, мне нужно сделать в значительной степени всех работ, участвующих в настройке подключения к сети в любом случае. Поэтому, возможно, ответ: «Это слишком много хлопот, чтобы сделать это»?

+0

Have Вы искали «притворной Alamofire», там, кажется, несколько полезных предложений, таких как https://github.com/Alamofire/Alamofire/blob/master/Tests/URLProtocolTests.swift#L27-L81 и http://stackoverflow.com/questions/26918593/unit-testing-http-traffic -in-alamofire-app – Michael

+1

Да, поэтому я сказал, что мне не интересно насмехаться над всем стеком, и это то, что в основном предлагалось этими сообщениями. –

+0

Вы находите способ высмеять ответ? –

ответ

4

У меня был успех, переопределив метод startLoading URLProtocol. Вы можете найти пример этого в тестовом каталоге Alamofire в разделе URLProtocolTests.swift.

Перехватывая этот вызов, можно захватить входящий запрос, а затем проанализировать URL-адрес, чтобы он соответствовал вашему выбранному макету ответа. Ниже приведен пример того, как я обрабатывать ответ:

override func startLoading() { 
    //Seperate module I used to handle the request 
    let data:NSData = mocks.find(request) as! NSData 

    let client = self.client 
    let response = HTTPURLResponse(url: (request.url)!, statusCode: 200, httpVersion: "HTTP/1.1", headerFields: cannedHeaders) 

    client?.urlProtocol(self, didReceive: response!, cacheStoragePolicy: URLCache.StoragePolicy.notAllowed) 
    cannedResponse = data 
    client?.urlProtocol(self, didLoad: cannedResponse as! Data) 
    client?.urlProtocolDidFinishLoading(self) 

    activeTask?.resume() 
} 

я опубликовал полный пример того, как сделать это на GitHub здесь: https://github.com/ksteigerwald/MockAlamofire

+0

Вот библиотека GitHub, которая упрощает этот https://github.com/ksteigerwald/Hunkered – rambossa