我有一个单元测试套件,其中当单独执行,它的每一个测试成功。
但是,如果我执行整个套件,一个测试时挂起应该初始化一个单例。如果某个其他单元测试执行后,只挂 - 如果我更改顺序,整个测试套件成功执行。 如果我暂停悬挂单元测试的执行,堆栈跟踪如下:
执行挂在声明static let shared = StoreManager()
:
class StoreManager: NSObject, CalledByDataStoreInStoreManager {
static let shared = StoreManager() // Instantiate the singleton
// …
}
其他单元测试之前执行,使检查挂不使用StoreManager
单。
我的问题是: 什么可能是第一次测试可以让在第二测试单失败的初始化,虽然这单没有在第一次测试中使用的原因是什么?
所以,显而易见的答案是,有你这是影响你的第二个测试第一测试中出现的副作用。正是这样的副作用是什么,不过,是依赖于两件事情:
StoreManager
发生什么从你的描述,这听起来像第一次测试以某种方式影响到什么,然后在StoreManager
初始化使用,当测试是不是你的第二个测试之前运行,这是不会受到影响。
解决:副作用,就是BHendricks的答案向我指出,为以下几点:
由于我的应用程序也使用手表,手表会在应用程序委托激活,所推荐的苹果。这是通过调用在WatchSessionManager
实例函数来完成,而这个实例的初始化试图初始化,它也试图通过Storemanager是init是独生子。
这创造了一个init周期僵局。
由于我使用一个模拟的应用程序委托单元测试,我现在有手表激活连接会话初始化没有在WatchSessionManager
实例的初始化不必要,避免僵局。