Concrete Logo
Hamburger button

Teste unitário – Requisição de Rede

  • Blog
  • 16 de Junho de 2017

*Este post foi originalmente publicado (em inglês) no Cocoa Academy. Veja aqui.

Hoje em dia quase todos os apps fazem uma requisição de rede seja para autenticar um usuário, atualizar informações importantes ou para rastrear como os usuários estão usando o app. Essa requisição é uma forma de o app atualizar seus dados e mostrar novas informações sem a necessidade de usuário fazer uma atualização na App Store ou no Google Play.

Existem algumas bibliotecas que ajudam os desenvolvedores a fazerem essas requisições de rede no mundo iOS. Neste post, vamos usar a Alamofire.

Uma requisição de rede retorna erro ou sucesso, e o sucesso vem com uma resposta que pode ser uma string JSON. Para isso, vamos criar uma enum chamada Result.

Nossa Result é uma enum genérica que pode receber qualquer objeto em caso de sucesso ou retornar um simples erro. Este erro pode ser trocado por error(Error) e retornar um objeto erro, mas para este exemplo vamos ficar no básico.

Agora vamos criar outro enum para lidar com nossa resposta (JSON), que pode ser um array de objetos ou apenas um. Nós vamos usar um type alias JsonObject, então não esqueça de declarar typealias JsonObject = [String: Any]

Esta enum vai tentar converter a resposta em um objeto, se falhar tentaremos transforma-lá em um array. Caso nenhuma das formas funcione, retornaremos nil.

Protocolo de rede

Agora temos que isolar nossa library de requisição do nosso código. Isso significa criar uma camada em volta da Alamofire. Assim, ela poderá ser facilmente substituída se necessário. Para alcançar isso nós vamos criar um protocolo chamado NetworkRequest com uma func request(_ url: URL, method: HTTPMethod, parameters: [String: Any]?, headers: [String: Any]?, completion: @escaping(Result<Json>) -> void)

Se você olhar bem, vai ver que nossa completion retorna um Result<T> no qual T é um Json. O que isso significa exatamente? Se nossa requisição chega ao servidor, nosso resultado será um sucesso e retornará um Json associado. Lembre-se que nosso Json pode conter um objeto ou array.

Agora nós criamos nossa RealNetworkRequest que vai implementar nosso protocolo NetworkRequest. Essa é a camada que vamos construir em volta da Alamofire.

Finalmente, vamos fazer alguns testes na nossa classe RealNetworkRequest. Para isso, vamos usar a library Mockingjay, que faz stubs nas requisição HTTP. O método stub da Mockingjay tem duas closures: uma para a requisição e outra para construir a resposta. Vamos usar everything nos nossos testes.

Quando chamamos self.stub(everything, json(object)), estamos pedindo à Mockingjay para “enganar” todas as requisições de rede e retornar um json(object) como resposta. Por conta disso, nós podemos chamar qualquer URL, como www.google.com, por exemplo.

Nós testaremos nossa RealNetworkRequest :

– em caso de a resposta do servidor for um objeto JSON, array ou até mesmo um JSON inválido;
– se a resposta do nosso servidor for um erro;
– e se ela adiciona cabeçalhos e parâmetros na requisição.

Esses testes são exemplos do método GET, você pode duplicá-los para o POST, PUT ou qualquer outro método HTTP que você use em sua aplicação. Só lembre de testar o comportamento esperado da sua classe.

Ficou alguma dúvida ou tem alguma observação a fazer? Deixe um comentário.

É desenvolvedor iOS e quer trabalhar em projetos desafiadores? Fale com a gente!