2017-04-07 3 views
0

J'ai défini ma propre classe avec des méthodes qui correspondent à la signature du rappel complet URLSession, e. g. (Data?, Response?, Error?) -> Void. La méthode contient une logique commune pour gérer la réponse, e. g. vérification des données, analyse, etc Maintenant, je voudrais tester cette méthode unitaire. Les méthodes contiennent certaines vérifications, par exemple,Enveloppe de test unitaire pour URLSession completer

guard let data = data else { 
    //some logic 
    return 
} 

Ici, je voudrais tester cette fonction sera vraiment terminée. Bien sûr, il n'est pas possible de l'atteindre contre un retour de vide (je pense, peut-être que j'ai raté quelque chose). Autre option: sélectionnez la méthode throws, puis testez une erreur spécifique. Mais alors cette méthode ne rentrera pas dans la méthode URLSession.shared.dataTask. Suis-je paranoïaque à propos de ces choses? Y a-t-il une possibilité de l'atteindre? Merci d'avance.

Répondre

0

Habituellement j'essaie de séparer la logique de requête en plusieurs parties:

1) Routeur 2) client API qui utilise un routeur 3) modèle de cartographie

Et toutes ces pièces que vous pouvez tester.

Comment vous pouvez tester client API:

fileprivate func testPerformanceOfGetNewsFromAPI() { 

     let expectationTimeout: Double = 30.0 

     self.measure { 

      let expectation = self.expectation(description: "Get gifters") 

      NewsAPIClient.getNews(closure: { response in 
       expectation.fulfill() 
      }) 

      self.waitForExpectations(timeout: expectationTimeout) { error in 
       XCTAssertNil(error) 
      } 
     } 
    } 

Ce test vérifie. APIClient peut-il recevoir une réponse dans les 30 secondes.

Comment vous pouvez tester la cartographie:

Pour la cartographie, j'utilise JASON: https://github.com/delba/JASON

Configurez votre fichier rapide:

import XCTest 
import JASON 
@testable import ProjectName 

final class NewsTests: XCTestCase { 

    // MARK: - Properties 
    fileprivate var news: News! 

    // MARK: - Lyfecycles 
    override func setUp() { 
     super.setUp() 

     news = mockExample() 
    } 

    override func tearDown() { 

     news = nil 
     super.tearDown() 
    } 
} 

Ensuite, créez dans cette classe votre simulacre:

fileprivate func mockExample() -> ExampleModel? { 

     let data: Data 

     let json: JSON 

     do { 
      try data = Data(resource: "MyExampleFile.json") // Here enter your JSON example file. Target member ship for this file should be your test target 

      try json = JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions()) as! JSON 

     } catch let error { 
      XCTFail(error.localizedDescription) 
      return nil 
     } 

     let model = ExampleModel(json: json) 

     return model 
    } 

Ensuite, vous pouvez écrire essai dans cette classe:

fileprivate func testMapping() { 

     XCTAssertNotNil(news) 
     XCTAssertEqual(news.title, mockExample()?.title) 
     XCTAssertEqual(news.text, mockExample()?.text) 
     XCTAssertEqual(news.timeStamp, mockExample()?.timeStamp) 
    } 

Dans la logique de test, vous pouvez également ajouter les téléchargements d'images (si elles sont présentes dans JSON). Ainsi, vous pouvez vérifier si le modèle actuel est correct pour vous, peut traiter la réponse JSON.

+0

Merci pour la bonne réponse. Mais je pense que ce n'est pas exactement ce que j'ai demandé. J'ai également séparé le flux de demandes en parties logiques. Et j'ai besoin de tester si la complétion de la requête sera terminée si une partie est défectueuse (par exemple, un code HTTP incorrect, une réponse invalide qui ne peut pas être analysée par exemple). Si le flux ne s'arrête pas si quelque chose ne va pas, alors je peux avoir une erreur d'exécution. Merci. – Yura