2015-11-10 8 views
6

Ich habe UI Tests Ziel zum Testen von MyApp. Um bestimmte MyApp-Bedingungen zu testen, muss ich Benachrichtigungen vom UI-Testziel an das MyApp-Ziel senden. Um eine Benachrichtigung von UI-Test Zielfunktion poste ich bin mit diesem:UI-Tests + postNotificationName + erreicht nie Beobachter + Xcode 7

NSNotificationCenter.defaultCenter().postNotificationName(name, object: nil, userInfo: aUserInfo) 

Es sieht aus, dass diese Meldung nie erreicht Beobachter von UI-Test Ziel, aber es funktioniert gut, wenn diese Benachrichtigung von MyApp Ziel Entsendung.

So melden Sie eine Benachrichtigung von UI Target an MyApp target?

Mit Xcode 7.

+0

Rufst du addObserver, wo Sie hören wollen? Sind Sie sicher, dass der addObserver vor postNotification aufgerufen wird? – picciano

+0

Das Senden einer Benachrichtigung über das MyApp-Ziel funktioniert problemlos, aber beim Senden von UI-Tests ist das Ziel nicht richtig. Ich habe die Frage ebenfalls aktualisiert. – Ramis

+1

Off topic, aber es ist gute Praxis (oder Konvention?) Zu senden "Selbst" als das Argument "object". –

Antwort

7

ähnliche Problem (versucht NSNotification um sicherzustellen, dass nach bestimmten UI-Aktion geschrieben wird). Hat kleine Recherchen dazu gemacht.

NSNotification wird nicht empfangen, da UI-Test und App in verschiedenen Prozessen ausgeführt werden. NSNotification kann keine Prozessgrenzen durchlaufen, und NSDistributedNotificationServer ist unter iOS nicht verfügbar. Daher gibt es derzeit keine standardmäßige und einfache Möglichkeit, NSNotifications zwischen der UI-Testsuite und der Anwendungsinstanz zu veröffentlichen.

Es gibt jedoch einige Möglichkeiten, zwischen Prozessen zu kommunizieren, und vielleicht kleine Wrapper oder sogar NSDistributedNotificationCenter iOS-Ersatz für Testzwecke schreiben. Sehen Sie sich diesen großartigen Artikel aus Realm an: https://academy.realm.io/posts/thomas-goyne-fast-inter-process-communication/

2

Ich wollte UI Testing verwenden, um Speicherlecks zu testen, und um dies zu tun, wollte ich im UI-Testfall informiert werden, wenn jemals ein View Controller deinit aufgerufen wird. So kam ich mit diesem auf den IPC-Mechanismus zu schaffen:

/** 
    Provides simple IPC messaging. To use this class you need to include  
    #include <notify.h> 
    in your bridging header. (Ab)uses UIPasteboard for message delivery, ie. 
    should not be used in production code. 
*/ 
public class SimpleIPC { 
    /// Event notification name for libnotify. 
    private static let notifyEventName = "com.foo.SimpleIPC" 

    /// libnotify token. 
    private var token: Int32 = 0 

    /// Starts listening to the events 
    public func listen(callback: (String? -> Void)) { 
     notify_register_dispatch(SimpleIPC.notifyEventName, &token, dispatch_get_main_queue()) { token in 
      callback(UIPasteboard.generalPasteboard().string) 
     } 
    } 

    public class func send(message: String) { 
     UIPasteboard.generalPasteboard().string = message 
     notify_post(SimpleIPC.notifyEventName) 
    } 

    deinit { 
     notify_cancel(token) 
    } 
} 

Es verwendet eine Kombination von libnotify und UIPasteboard für die Benachrichtigung + Datenlieferung. Verwendbar für die 1-Weg-Kommunikation wie für 2-Wege, entweder die Nutzdaten enthalten ein Sender-Token oder 2 Instanzen mit parametrisierten libnotify-Ereignisnamen.

  • Matti
+0

Wie würde der 2way hier arbeiten? Ich habe Probleme, es einzurichten. Was genau ist der Absender Token hier? –

0

Ist das für einen Mac App oder einem iOS-App? Für eine Mac-Anwendung können Sie NSDistributedNotificationCenter als solches verwenden.

In Ihrem Teilnehmer:

NSDistributedNotificationCenter.defaultCenter().addObserver(object, selector: #selector(ObjectsClass.myFuncWithoutParentheses), name: "uniqueString", object: nil) 

In Ihrem Verleger:

NSNotificationCenter.defaultCenter().postNotificationName("uniqueString" object:nil)