2017-04-05 4 views
-2

Je suis nouveau à Swift et j'ai suivi un tutoriel simple pour faire une application Magic Cocoa 8 balles qui chaque fois que je clique sur la balle, elle montre un conseil différent. J'essaie maintenant de pratiquer mes tests automatisés d'interface utilisateur en affirmant (XCTAssert) que l'étiquette "Piece of Advice" est égale à l'une des valeurs de chaîne dans mon tableau. Mon tableau ressemble à ceci et est dans mon ViewController.swift:Comment puis-je affirmer qu'une valeur d'une chaîne est égale à l'une des valeurs de chaîne d'un tableau utilisant XCTAssert dans Swift?

var adviceList = [ 
    "Yes", 
    "No", 
    "Tom says 'do it!'", 
    "Maybe", 
    "Try again later", 
    "How can I know?", 
    "Totally", 
    "Never", 
    ] 

Comment puis-je faire une affirmation dans mon dossier de UITests.swift qui affirme que la chaîne qui est montrée est égale à l'une des valeurs de chaîne dans le tableau ci-dessus?

+1

Copie possible de [Comment vérifier si un élément est dans un tableau] (http://stackoverflow.com/questions/24102024/how -to-check-if-an-element-is-in-an-array) –

+0

assert vrai sur la méthode contains un tableau peut-être? – DatForis

+0

Meta conseil déplacé d'une réponse: Bienvenue dans Stack Overflow! Vous obtenez quelques downvotes parce que les gens voient la question comme «comment puis-je vérifier si un tableau contient une valeur» qui a déjà été posée plusieurs fois. La prochaine question que vous posez jette un coup d'oeil rapide sur ["comment poser une bonne question"] (https://stackoverflow.com/help/how-to-ask) pour s'assurer que ce n'est pas mal interprété. – halfer

Répondre

1

Il est possible que vous demandiez comment accéder à l'état de l'application à partir d'un test d'interface utilisateur ou simplement en testant l'interface utilisateur.

Je pense que c'est une question assez intéressante, donc je vais répondre parce que c'est quelque chose que je ne connais pas beaucoup et qui, je l'espère, invitera d'autres personnes à intervenir et à corriger.

Contexte: Une magie de base 8 Ball projet

Je mis en place un projet de base avec un contrôleur de vue qui contient deux vues: une étiquette et un bouton. En appuyant sur le bouton Mises à jour du texte de l'étiquette avec un message aléatoire:

import UIKit 

struct EightBall { 
    static let messages = ["Yes", "No", "It's not certain"] 

    var newMessage: String { 
     let randomIndex = Int(arc4random_uniform(UInt32(EightBall.messages.count))) 
     return EightBall.messages[randomIndex] 
    } 
} 

class ViewController: UIViewController { 

    let ball = EightBall() 

    @IBOutlet weak var messageLabel: UILabel! 

    @IBAction func shakeBall(_ sender: Any) { 
     messageLabel.text = ball.newMessage 
    } 
} 

Un test UI de base

Voici un test de l'interface utilisateur commentée montrant comment automatiser tapant sur le bouton, et saisir la valeur de l'étiquette, et puis en vérifiant que la valeur de l'étiquette est un message valide.

import XCTest 

class MagicUITests: XCTestCase { 

    // This method is called before the invocation of each test method in the class. 
    override func setUp() { 
     super.setUp() 

     // In UI tests it is usually best to stop immediately when a failure occurs. 
     continueAfterFailure = true 
     // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 
     XCUIApplication().launch() 
    } 

    func testValidMessage() { 

     // Grab reference to the application 
     let app = XCUIApplication() 

     // #1 
     // Grab reference to the label with the accesability identifier 'MessageLabel' 
     let messagelabelStaticText = app.staticTexts["MessageLabel"] 

     // Tap the button with the text 'Shake' 
     app.buttons["Shake"].tap() 

     // get the text of the label 
     let messageLabelText = messagelabelStaticText.label 

     // #2 
     // check if the text in the label matches one of the allowed messages 
     let isValidMessage = EightBall.messages.contains(messageLabelText) 

     // test will fail if the message is not valid 
     XCTAssert(isValidMessage) 
    } 
} 

A # 1 L'approche que j'utilise pour obtenir l'étiquette est d'accéder aux étiquettes accessibilityIdentifier propriété. Pour ce projet, je suis entré dans ce scénario, mais si vous définissez vos points de vue dans le code, vous pouvez directement définir la propriété accessibilityIdentifier vous-même. L'autre chose qui prête à confusion ici est que pour avoir accès aux éléments de la vue, vous ne naviguez pas dans la hiérarchie des vues, mais un proxy de la hiérarchie, c'est pourquoi la syntaxe pour obtenir un label est l'impair 'staticTexts »(Les références au bas du message expliquent cela plus en détail).

enter image description here

Pour # 2 Je suis inspectant la structure définie dans mon projet. Dans un test unitaire, vous pouvez accéder à cette importation @testable import ProjectName mais malheureusement, cette approche ne fonctionne pas pour le test de l'interface utilisateur. Au lieu de cela, vous devrez vous assurer que tout fichier source auquel vous souhaitez accéder à partir du test de l'interface utilisateur est inclus en tant que cible.Vous pouvez le faire dans Xcode de ce panneau en vérifiant le nom de votre test de l'interface utilisateur:

enter image description here

Plus de références de test de l'interface utilisateur:

+0

Merci beaucoup :) –

+0

Ceci est une réponse splendide, beau travail! J'espère que c'est bien que j'aie déplacé le commentaire méta sur un commentaire, puisque nous voulons que les posts soient centrés sur le matériel lui-même ici. Les commentaires sont beaucoup plus libres, ils sont donc plus appropriés pour les notes sur les questions ou les réponses elles-mêmes. – halfer