Тесты пользовательского интерфейса + postNotificationName + никогда не достигает наблюдателя + Xcode 7

У меня есть цель UI Tests для тестирования MyApp. Чтобы протестировать определенные условия MyApp, мне нужно опубликовать уведомления из цели тестирования пользовательского интерфейса в цель MyApp. Чтобы опубликовать уведомление из целевой функции UI Test, я использую это:

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

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

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

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


person Ramis    schedule 10.11.2015    source источник
comment
Вы вызываете addObserver там, где хотите слушать? Вы уверены, что addObserver вызывается перед postNotification?   -  person picciano    schedule 10.11.2015
comment
Публикация уведомления из цели MyApp работает нормально, но при публикации из цели тестов пользовательского интерфейса это не так. Я также обновил вопрос.   -  person Ramis    schedule 11.11.2015
comment
Не по теме, но хорошей практикой (или соглашением?) является отправка self в качестве аргумента object.   -  person Nicolas Miari    schedule 11.11.2015
comment
Верно и обратное (по крайней мере, для моего случая): наблюдатель из цели тестирования пользовательского интерфейса не может видеть уведомления, отправленные из основного приложения, но видит уведомления, отправленные из внутреннего теста.   -  person Cemen    schedule 12.01.2016
comment
Быстрый вопрос, сможем ли мы использовать сокеты для отправки/получения данных здесь без прав?   -  person gran_profaci    schedule 24.01.2017


Ответы (3)


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

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

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

person Cemen    schedule 12.01.2016

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

  • Матти
person Matti    schedule 02.07.2016
comment
Как здесь будет работать 2way? У меня возникли проблемы с его настройкой. Какой именно токен отправителя здесь? - person gran_profaci; 07.01.2017

Это приложение для Mac или для iOS? Для приложения Mac вы можете использовать NSDistributedNotificationCenter как таковой.

В вашем подписчике:

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

В вашем издателе:

NSNotificationCenter.defaultCenter().postNotificationName("uniqueString" object:nil)
person dangerdex    schedule 17.08.2016