UI测试+ postNotificationName +永远不会到达观察者+ Xcode 7

时间:2015-11-10 15:18:43

标签: ios xcode ui-testing xcode-ui-testing

我有测试MyApp的UI测试目标。要测试特定的MyApp条件,我需要将通知从UI测试目标发布到MyApp目标。要从UI测试目标函数发布通知,我使用此:

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

看起来这个通知永远不会从UI测试目标到达观察者,但是从MyApp目标发布此通知时它可以正常工作。

如何从UI Target发布通知到MyApp目标?

使用Xcode 7。

3 个答案:

答案 0 :(得分:8)

有类似问题(尝试确保在某些UI操作后发布NSNotification)。对此进行了小规模的研究。

由于UI测试和应用程序在不同的进程中运行,因此未收到NSNotification。 NSNotification无法通过进程边界,并且NSDistributedNotificationServer在iOS上不可用。因此,目前没有默认和简单的方法在UI测试套件和应用实例之间发布NSNotification。

但是,有一些方法可以在进程之间进行通信,也可以编写小包装器甚至是NSDistributedNotificationCenter iOS代理进行测试。查看Realm的这篇精彩文章:https://academy.realm.io/posts/thomas-goyne-fast-inter-process-communication/

答案 1 :(得分: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的组合来进行通知+数据传递。可用于单向通信,对于双向,要么使有效载荷包括发送者令牌,要么使用具有参数化libnotify事件名称的2个实例。

  • 马蒂

答案 2 :(得分:0)

这适用于Mac应用程序还是iOS应用程序?对于Mac应用程序,您可以使用NSDistributedNotificationCenter。

在您的订阅者中:

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

在您的发布商中:

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