2016-02-02 10 views
6

Mam Swift 2 kod za pomocą Alamofire, który wysyła zapytanie do zdalnego adresu URL, że spodziewa się zwrócić JSON. Zrobiłem wystarczająco dużo interaktywnych testów, aby być dość pewnym, że zachowuje się on wystarczająco poprawnie. Teraz chcę przetestować urządzenie, aby móc polegać na tym kodzie, a następnie przejść do innych rzeczy.Jak mogę sfałszować tylko odpowiedź Alamofire?

Jestem nowicjuszem w Swift, mimo że programowałem Perl OO przez dziesięciolecia, więc prawdopodobnie coś przeoczyłem.

Oto jak skonfigurowałem dotychczasowy kod sprawdzający (nieistotne rzeczy, takie jak usunięcie nazwy użytkownika i hasła, aby uniknąć yak-shaving). Kod wywołujący określa nazwę użytkownika i hasło i oczekuje, że jeden z dwóch wywołań zwrotnych będzie wywoływany za każdym razem, gdy zostanie uzyskany wynik. (I nie dostać się tak daleko, jak do czynienia z błędami, więc proszę nie dostać side-śledzone na ten temat.)

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 
} 

Co szukam jest sposobem podejmowania surowego JSON i przepuszczenie do Alamofire w jakiś sposób, więc mogę wygenerować obiekt odpowiedzi, który zawiera odpowiednie elementy, w tym błędy, jeśli nic nie dostało (timeout?) lub zwrócone dane były nieprawidłowe (np. format 404 lub 500 strony HTML).

Jestem zadowolony w tej chwili z funkcji checkUsername, więc nie jestem zainteresowany nikim, kto mówi "używaj OHHTTPStubs". Czekam na testowanie tylko kodu, którego nie jestem pewien, czyli kodu, który właśnie napisałem.

EDIT: Po faffed o kilka więcej, wygląda na to wewnętrzne Alamofire są wystarczająco połączone, że aby stworzyć fałszywą odpowiedź, muszę zrobić prawie wszystkie prace zaangażowanych w utworzenie połączenia sieciowego anyway. Być może więc odpowiedź brzmi: "to zbyt wiele wysiłku, aby to zrobić"?

+0

masz szukał „mock Alamofire”, wydaje się być kilka przydatnych sugestii, takich jak https://github.com/Alamofire/Alamofire/blob/master/Tests/URLProtocolTests.swift#L27-L81 i http://stackoverflow.com/questions/26918593/unit-testing-http-traffic -in-alamofire-app – Michael

+1

Tak, dlatego powiedziałem, że nie jestem zainteresowany kpiną z całego stosu, co sugerowały te posty. –

+0

Czy znajdujesz sposób na wyśmiewanie tylko odpowiedzi? –

Odpowiedz

4

miałem sukces nadrzędnymi metodę URLProtocol za startLoading. Możesz znaleźć przykład tego w katalogu testowym Alamofire pod URLProtocolTests.swift.

Po przechwyceniu tego połączenia można przechwycić przychodzące żądanie, a następnie przeanalizować adres URL, aby dopasować wybraną odpowiedź próbną. Poniżej jest przykład tego, jak sobie radzić odpowiedź:

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() 
} 

napisałem pełny przykład jak to zrobić na github tutaj: https://github.com/ksteigerwald/MockAlamofire

+0

Oto biblioteka GitHub, która upraszcza ten https://github.com/ksteigerwald/Hunkered – rambossa

Powiązane problemy