2015-11-10 5 views
6

私はMyAppをテストするためのUIテストターゲットを持っています。特定のMyApp条件をテストするには、UIテストターゲットからMyAppターゲットに通知を送信する必要があります。UIテスト+ postNotificationName + observer + Xcodeに到達しない7

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

それは、この通知は、UIテストの対象から観測者に到達しないことに見えますが、MyAppをターゲットからこの通知を掲示するとき、それが正常に動作します:UIテスト対象関数からの通知を投稿するには、私はこれを使用しています。

UIターゲットからMyAppターゲットに通知を送信する方法はありますか。 Xcodeの7.に

+0

はあなたが聴きたいaddObserverを呼び出していますか? addObserverがpostNotificationの前に呼び出されていますか? – picciano

+0

MyAppターゲットからの通知通知はうまく動作しますが、UIテストターゲットから投稿すると通知されません。私も同様の質問を更新しました。 – Ramis

+1

トピックはありませんが、 'self'を' object'引数として送るのは良い習慣(あるいは規則ですか?)です。 –

答えて

7

を使用して

は(NSNotificationは、特定のUIアクションの後に掲載されていることを確認しようとしている)と同様の問題を抱えています。これに関する小さな研究をしました。

UIテストとアプリが別のプロセスで実行されているため、NS通知が受信されません。 NSNotificationはプロセス境界を通過できず、NSDistributedNotificationServerはiOSでは使用できません。したがって、現在、UIテストスイートとアプリインスタンスの間にNSNotificationsを投稿するデフォルトの簡単な方法はありません。

しかし、プロセス間でやりとりしたり、小さなラッパーやNSDistributedNotificationCenterのiOSサロゲートを使ってテストすることができます。レルムからこの偉大な記事をチェックしてください:https://academy.realm.io/posts/thomas-goyne-fast-inter-process-communication/

2

私は、メモリリークをテストするためにUIテストを使いたいと思いました。これを行うには、ビューコントローラのdeinitが呼び出されたときにUIテストケースで情報を得たいと思っていました。だから私は、IPCメカニズムを提供するために、この思い付いた:

/** 
    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) 
    } 
} 

それは通知+データ配信のためのlibnotifyUIPasteboardの組み合わせを使用しています。 2方向の片方向通信の場合は、ペイロードに送信者トークンを含めるか、パラメータ化されたlibnotifyイベント名を持つ2つのインスタンスを使用します。

  • マッティ
+0

2wayはどのようにここで動作しますか?私はそれを設定する問題を抱えてきた。ここで送信者トークンとは何ですか? –

0

のMacアプリやiOSアプリのために、このですか? Macアプリケーションの場合は、NSDistributedNotificationCenterをそのまま使用することができます。あなたの加入者で

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

あなたのパブリッシャーで:

NSNotificationCenter.defaultCenter().postNotificationName("uniqueString" object:nil) 
関連する問題