2016-03-23 21 views
3

Es gibt ein paar Fragen zu diesem Thema, aber sie sind nicht ganz das, wonach ich suche. Ich habe eine kleine Swift App-Eingabeaufforderung für meine App geschrieben, die zwei UIAlertController Instanzen darstellt, eine von der anderen ausgelöst.Trigger UIAlertAction auf UIAlertController programmgesteuert?

Ich versuche jetzt, Unit-Test dies und versuchen, diese zweite Warnung in den Tests zu erreichen. Ich habe einen einfachen Spion geschrieben, um den ersten Controller zu überprüfen, aber ich möchte einen Weg finden, eine der Aktionen beim ersten Alarm auszulösen, was wiederum den zweiten anzeigt.

Ich habe bereits versucht alert.actions.first?.accessibilityActivate(), aber es schien nicht in den Handler dieser Aktion zu brechen - das ist, was ich danach bin.

Antwort

4

Hier ist ungefähr das, was ich getan habe:

  1. eine verspottet Version meiner Klasse erstellt, das den Alarm-Controller darstellen würde, und in meinen Unit-Tests, um dieses Mock verwendet.

  2. overrode die folgende Methode, die ich in der nicht-verspottet Version erstellt hatte:

    func alertActionWithTitle(title: String?, style: UIAlertActionStyle, handler: Handler) -> UIAlertAction 
    
  3. In der überschriebenen Implementierung gespeichert alle Details über die Aktionen in einigen Eigenschaften (Handler ist nur ein typealias ‚d () -> (UIAlertAction))

    var didCreateAlert = false 
    var createdTitles: [String?] = [] 
    var createdStyles: [UIAlertActionStyle?] = [] 
    var createdHandlers: [Handler?] = [] 
    var createdActions: [UIAlertAction?] = [] 
    
  4. Dann, wenn meine Tests ausgeführt wird, den Weg durch die Warnungen zu durchqueren, ich implementiert eine callHandlerAtIndex Methode t iterieren durch meine Handler und führen Sie die richtige aus. Diese

bedeutet, dass meine Tests in etwa so aussehen:

feedback.start() 
feedback.callHandlerAtIndex(1) // First alert, second action 
feedback.callHandlerAtIndex(2) // Second alert, third action 
XCTAssertTrue(mockMailer.didCallMail)