2015-11-10 5 views
6

У меня есть тест пользовательских интерфейсов для тестирования MyApp. Чтобы протестировать определенные условия MyApp, мне нужно отправлять уведомления с целевого объекта UI Test на целевой объект MyApp. Для того, чтобы получить возможность отправлять уведомление от тестирования UI целевой функции Я использую это:UI-тесты + postNotificationName + никогда не доходит до наблюдателя + Xcode 7

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

Похоже, что это уведомление никогда не достигает наблюдателя от цели тестирования пользовательского интерфейса, но он отлично работает, отправляя уведомление с целью MyApp.

Как отправить уведомление от пользовательского интерфейса Target to MyApp target?

Использование Xcode 7.

+0

Вы звоните addObserver, где вы хотите слушать? Вы уверены, что addObserver вызывается перед postNotification? – picciano

+0

Уведомление о отправке с целевого объекта MyApp работает отлично, но при отправке с пользовательских интерфейсов целевой дозы не требуется. Я также обновил вопрос. – Ramis

+1

Отключить тему, но это хорошая практика (или конвенция?), Чтобы отправить 'self' в качестве аргумента' object'. –

ответ

7

Есть аналогичная проблема (пытаясь обеспечить NSNotification в настоящее время размещены после определенного действия UI). Небольшие исследования по этому поводу.

NSNotification не принимается, потому что UI-тест и приложение работают в разных процессах. NSNotification не может пройти через границы процесса, а NSDistributedNotificationServer недоступен в iOS. Таким образом, в настоящее время нет стандартного и простого способа публикации NSNotifications между набором тестов пользовательского интерфейса и экземпляром приложения.

Однако существует несколько способов взаимодействия между процессами и, возможно, написать небольшую обертку или даже NSDistributedNotificationCenter iOS-суррогат для целей тестирования. Ознакомьтесь с этой замечательной статьей из Realm: https://academy.realm.io/posts/thomas-goyne-fast-inter-process-communication/

2

Я хотел использовать тестирование пользовательского интерфейса для проверки утечек памяти, и для этого я хотел получить информацию в тестовом примере пользовательского интерфейса, когда вызывается деинит контроллера вида. Так что я пришел с этим, чтобы обеспечить механизм 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) 
    } 
} 

Он использует комбинацию libnotify и UIPasteboard для доставки уведомлений + данных. Используется для однонаправленной связи, как есть, для двухстороннего использования, чтобы сделать полезную нагрузку включать токен отправителя или использовать 2 экземпляра с параметризованными именами событий libnotify.

  • Матти
+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)