J'essaie d'effectuer des tests de fonctionnement réellement simples / fonctionnels à Swift, mais j'ai des doutes que je dois résoudre pour pouvoir créer des tests utiles.
Je veux vérifier qu'un contrôleur présenté par un autre contrôleur existe dans la hiérarchie de navigation de l'application (peu importe si le contrôleur a été présenté dans une entreprise de navigation, comme modal ou autre). p>
Si j'instine et affichez les contrôleurs programmatismatiquement, directement dans les fonctions de test, lorsque je vérifie le contrôleur Voici un exemple de pseudo-code: p>
3 Réponses :
Vous avez d'abord indiqué que cela n'a pas d'importance si la vue est présentée par un contrôleur de navigation. J'ai donc créé une application vide avec une entreprise de navigation comme contrôleur initial et deux visiteurs, le premier est juste Namend première chose à noter: Si vous utilisez une carte de navigationContrôleur, la racine racine sera toujours la navigationController. Donc, alors vérifiez ce qui se passe si nous chargons d'abord le Code> ViewController Code>, puis dans cette touche The ViewController code> La seconde est dans mon cas
ViewControlSecond code> Quel est votre
TheXpecyClass code> contrôleur.
ViewControlSeconde Code>: P>
let storyBoard:UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle(forClass: self.dynamicType))
let controllerSecond = storyBoard.instantiateViewControllerWithIdentifier("ViewControllerSecond") as? ViewControllerSecond
controllerSecond?.loadView()
self.navigationController?.pushViewController(controllerSecond!, animated: false)
let navigationController = UIApplication.sharedApplication().keyWindow?.rootViewController as UINavigationController
let currentController: AnyObject = navigationController.viewControllers[0]
println(navigationController.viewControllers)
Si j'instaine et affichez les contrôleurs programmatismatiquement, directement dans les fonctions de test, lorsque je vérifie le contrôleur sur le dessus, je reçois toujours le contrôleur racine de la scénario au lieu du contrôleur que je viens d'instancié, comme si les contrôleurs que j'ai manuellement créé ne sont jamais ajoutés dans la hiérarchie de l'application. P>
À partir du code que vous avez écrit, vous ne vérifiez pas le contrôleur sur le dessus, mais vous vérifiez que le contrôleur de vue de racine elle-même (qui contient tous les contrôleurs d'affichage de la hiérarchie, y compris les contrôleurs de navigation), c'est pourquoi vous obtenez toujours le contrôleur de la vue de la racine de scénario. Pour obtenir le haut de la plupart des contrôleurs du contrôleur d'affichage, vous pouvez utiliser la fonction récursive suivante qui prend le contrôleur d'affichage racine et renvoyer sa plus grande contrôleur P>
xxx pré> puis dans votre fonction de test vérifie le contrôleur que cette fonction renvoie p>
xxx pré> blockQquote>
Si j'instine et montrez des contrôleurs programmatiquement, directement dans Les fonctions de test, lorsque je vérifie le contrôleur sur le dessus, je reçois toujours le contrôleur racine de scénario au lieu du contrôleur que j'ai juste instancié, comme si les contrôleurs que j'ai créés manuellement ne sont jamais ajoutés à la hiérarchie de l'application. P>
Qu'est-ce que vous dites ici est vrai, ils ne sont pas ajoutés. Dans votre pseudo code, tout ce que vous avez fait était d'instancier certains contrôleurs de vue et de les pousser les uns sur les autres. P>
Pourquoi vous attendez-vous à être dans la hiérarchie de l'application? EM> Vous ne les avez jamais ajoutés là-bas . P>
Il y a en fait deux problèmes ici, et ce n'est que le premier. p>
Le deuxième numéro: p>
uiapplication.sharedaplication (). keywindow? .rootviewcontroller code> p>
Ce code saisit le contrôleur de vue racine, qui est en fait celui qui est sur le "fond" (supposant "haut" signifie plus visible). Lorsque vous utilisez un storyboard, cela sera presque toujours le contrôleur d'affichage initial. P>
Donc, même si vous avez ajouté vos contrôleurs de visualisation nouvellement instanciés à la hiérarchie, le test que vous faites ne passera toujours pas. P>
Solution suggérée forte> p >
En tant que test simple, vous n'avez pas besoin de tester que votre nouveau contrôleur d'affichage est situé sur la hiérarchie visuelle. Pour ce faire, vous auriez besoin de l'ajouter là-bas. p>
Tout ce que vous avez vraiment besoin de tester est - "Si je repousse mon contrôleur d'affichage sur cette pile de navigation nouvellement créée, elle doit être en haut de cette pile (visible)" P>
Ceci Bien que votre test ne dépend pas de l'état de l'application ou des autres contrôleurs dans la hiérarchie. P>
Code pseudo: p>
xxx pré> blockQuote>
Merci @jack vraiment intéressant. Comment testeriez-vous la présentation d'un contrôleur modal en utilisant cette logique?
Vous pouvez utiliser la fonction TOPMESSCONTROLLER CODE> dans la réponse de ZELB. Il va récursivement les push et les présents et trouveront la plus grande contrôleur. Cependant, passez dans
contrôleur1 code> au lieu de
.rootviewcontroller code> pour les mêmes raisons de ma réponse - votre
contrôleur1 code> n'est pas enfoncé sur
rootviewcontroller < / Code> Anywhere et vous n'avez pas besoin de le faire pour le tester. En fait, si vous avez appuyé sur la hiérarchie, votre test dépendrait du code qui fonctionne à l'extérieur de votre test (c'est-à-dire que vous modifiez la fenêtre ailleurs que le test échouerait), ce qui n'est pas souhaitable.
Vous devez montrer quel contrôleur 1.Push un autre contrôleur () fait. Votre message ne montre pas de quel type la classe suspectée devrait être.
Cette information n'est pas pertinente. Ils pourraient être n'importe quel type de contrôleur et présenté de différentes manières
Je dis qu'il est pertinent de vérifier où le problème pourrait être. Si vous dites que cela n'est pas pertinent, vous devez publier une solution plus générale comme poussant un autre contrôleur directement dans ce bloc. A mon humble avis