我有测试MyApp的UI测试目标。要测试特定的MyApp条件,我需要将通知从UI测试目标发布到MyApp目标。要从UI测试目标函数发布通知,我使用此:
NSNotificationCenter.defaultCenter().postNotificationName(name, object: nil, userInfo: aUserInfo)
看起来这个通知永远不会从UI测试目标到达观察者,但是从MyApp目标发布此通知时它可以正常工作。
如何从UI Target发布通知到MyApp目标?
使用Xcode 7。
答案 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)
}
}
它使用libnotify
和UIPasteboard
的组合来进行通知+数据传递。可用于单向通信,对于双向,要么使有效载荷包括发送者令牌,要么使用具有参数化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)