Estoy luchando un poco para averiguar la mejor manera de probar una aplicación que utiliza la Alamofire para ayudar a sincronizar con el servidor de datos.

Quiero ser capaz de poner a prueba mi código que utiliza Alamofire y procesos respuestas JSON desde un servidor.
Me gustaría burlarse de los exámenes, de modo que puedo alimentar a la espera de datos de la respuesta a esas pruebas, sin incurrir en real del tráfico de la red.

Este blog (http://nshipster.com/xctestcase/) describe cómo es fácil es Burlarse de un objeto en Swift – pero yo no estoy seguro de cómo hacerlo con Alamofire y su encadenados respuestas.

Iba yo a burlarse de el Manager? la Solicitud? Respuesta? Cualquier ayuda se agradece!

  • Literalmente, buscando la misma cosa ahora…
  • ¿lo comprendéis?
  • Consulte stackoverflow.com/questions/10807480/…
  • Creo que con el procedimiento de burlarse de los objetos que usted describe en su artículo podría ser en realidad mucho más simple que la de otros enfoques en LO vinculado artículo. Debería ser posible para burlarse de un Alamofire.Request respuesta correcta? Yo estaba mirando a través del código y no podía resolverlo de inmediato, pero supongo que se burlaba de la response(...) método de trabajo?
  • sería genial tener un artículo acerca de las pruebas con Alamofire!
  • No. La Fundación URL Sistema de Carga ya tiene esta gran construido-en el gancho para burlarse de las solicitudes de red. Utilizar o que en realidad la prueba en contra de un servidor de ensayo.
  • cual es la incorporada en el gancho de la que ustedes se refieren?
  • A qué te refieres NSURLProtocol?

InformationsquelleAutor Daniel D | 2014-11-13

3 Comentarios

  1. 21

    Voy a agregar otra respuesta, ya me has encontrado con este enfoque que en mi opinión es más fácil y muy sencillo de leer y de usar.

    He creado un muñeco Alamofire clase que contiene sólo las funciones y los tipos necesarios para las pruebas.
    Ahora me incluir este archivo en la prueba de destino en lugar de la verdadera Alamofire.

    Por ejemplo he creado mi versión de la Request clase en la que me defina un par de variables estáticas que me valorizar la función de la prueba, y para esta clase he implementado sólo el init y la responseJSON función.

    public class Request {
    
        var request:String?
        struct response{
            static var data:NSHTTPURLResponse?
            static var json:AnyObject?
            static var error:NSError?
        }
    
        init (request:String){
            self.request = request
        }
    
        public func responseJSON(options: NSJSONReadingOptions = .AllowFragments, completionHandler: (NSURLRequest, NSHTTPURLResponse?, AnyObject?, NSError?) -> Void) -> Self {
    
            completionHandler(NSURLRequest(URL: NSURL(string:self.request!)!), Request.response.data, Request.response.json, Request.response.error)
            return self
        }
    }
    

    Ahora puedo burlarse de una respuesta en una prueba:

    func testMytestFunction(){
        var HTMLResponse = NSHTTPURLResponse(URL: NSURL(string: "myurl")!, statusCode: 200, HTTPVersion: "HTTP/1.1", headerFields: nil)
    
        Request.response.data = HTMLResponse
        Request.response.json = LoadDataFromJSONFile("MyJsonFile")
    
        request(.POST, "myurl", parameters: nil, encoding: ParameterEncoding.JSON).responseJSON {
            (request, response, JSON, error) -> Void in
            //the JSON and response variable now contains exactly the data that you have passed to Request.response.data and Request.response.json
        }
    }
    

    La solicitud de función se define aquí:

    public func request(method: Method, URLString: URLStringConvertible, parameters: [String: AnyObject]? = nil, encoding: ParameterEncoding = .URL) -> Request {
    
        return Request(request: URLString.URLString)
    }
    
    public func request(URLRequest: URLRequestConvertible) -> Request {
    
        return Request(request: "fakecall")
    }
    
    • Ha pensado alguna vez acerca de compartir esta en Github? Es probable que salvar a la gente algún tiempo y llegar a ser muy útil
    • usted sabe – también hay una NSURLSession burlarse de marco – DVR – en github github.com/venmo/DVR
    • ¿Cuál es ese método de solicitud que está llamando en su testMytestFunction prueba?
    • esta respuesta está relacionada con una versión muy antigua de Alamofire. En ese momento toda la biblioteca fue implementado en un único Alamofire.swift archivo. No creo que pueda ser adoptado en el nuevo Alamofire versión… de todos modos me añado a la petición de los métodos en la respuesta.
  2. 9

    Esta pregunta se está poniendo viejo, pero me encontrado con el mismo problema, y la solución es muy fácil cuando se utiliza OHHTTPStubs.

    OHHTTPStubs sólo se burla de las respuestas que recibe de NSURLSession, por lo que funciona bien con Alamofire, y se obtiene muy buena cobertura de su ruta de código.

    Por ejemplo, en el caso de prueba, sólo se burlan de la respuesta mediante:

    OHHTTPStubs.stubRequestsPassingTest({
      (request: NSURLRequest) -> Bool in
        return request.URL!.host == "myhost.com"
      }, withStubResponse: {
      (request: NSURLRequest) -> OHHTTPStubsResponse in
        let obj = ["status": "ok", "data": "something"]
        return OHHTTPStubsResponse(JSONObject: obj, statusCode:200, headers:nil)
    })
    
    • cómo inyectar OHHTTPStubs a prueba la unidad., Yo uso OHHTTPStubs en la prueba de unidad, pero no funciona
  3. 1

    La espera de una respuesta por @mattt he puesto un ejemplo de mi código.

    Vamos a decir que tenemos un Client de la clase que se encarga de llamar a un servicio web simple. Esta clase implementa una función llamada userSignIn que realiza una sesión con el LR.

    Este es el código para el userSignIn función:

    func userSignIn(
            #email:String,
            password:String,
            completionHandler: (Bool, String?, NSError?) -> Void
            )-> Void
            {
    
                var parameters:[String:AnyObject] = [
                    "email":email,
                    "password":password,
                ]
    
    
                Alamofire.request(.POST, Client.urlPath, parameters: parameters, encoding: ParameterEncoding.JSON).responseJSON {
                    (request, response, JSON, responseError) -> Void in
    
                    //Setup callback params
    
                    //HERE WE INJECT THE "FAKE" DATA--------
                    var operationComplete = false
                    var accessToken:String?
                    var error:NSError?
                    //--------------------------------------
    
                    if let statusCode = response?.statusCode {
    
                        //Check for errors and build response data
                        (operationComplete, accessToken, error) = self.checkSignInResponse(statusCode, JSON: JSON)
                    }
    
                    //Call the completion handler
                    completionHandler(operationComplete, accessToken, error)
                }
        }
    

    El objetivo de la función es la de obtener un token desde el servicio web si la información transmitida por el usuario son correctos.

    La función checkSignInResponse (no me informe de su código, ya que no es útil para la respuesta) tiene la función de valorar las 3 variables operationComplete, accessToken y error dependiendo de la respuesta JSON recibido.

    Ahora que las 3 variables tienen un valor que llamamos el completionHandler uso de ellos.

    Cómo burlarse de esta función?!

    Para burlarse de la respuesta que reemplazar el userSignIn función directamente en la función de prueba (según lo explicado por el NSHipster artículo).

    func testUserSignIn_whenParamsAreInvalid(){
    
        class MockClient:Client {
    
            override func userSignIn(#email: String, password: String, completionHandler:
                (Bool, String?, NSError?) -> Void) {
    
                //Set callback params
                var operationComplete = false
                var accessToken:String? = nil
                var error:NSError? = NSError(domain: "Testing", code: 99, userInfo: nil)
    
                completionHandler(operationComplete, accessToken, error)
            }
        }
    
        signInViewController!.client = MockClient()
        signInViewController!.loadView()
    
        fillRegisterFieldsWithDataAndSubmit(femail(), password: fpassword())
    
        XCTAssertNotNil(signInViewController!.error, "Expect error to be not nil")
    
    }
    

    luego me sustituir el client en el interior del controlador de vista de que estoy probando el uso de mi «se burló» de cliente. En este caso, yo soy la prueba de que el controlador pasa a la función de la información que se no válido así que comprobar que el error propiedad de la controladora no es nil. A fuerza de estos datos simplemente establecer operationComplete a false y yo manual de generar un NSError.

    Żtiene algún sentido para ti? No estoy seguro de que esta prueba es buena… pero al menos puedo verificar el flujo de datos.

Dejar respuesta

Please enter your comment!
Please enter your name here