我有一个单元测试套件,其中每个测试单独执行时都会成功。
但是,如果我执行整个套件,则应该在初始化一个单例时挂起一个测试。如果某个其他单元测试执行后,只挂 - 如果我更改顺序,成功地在整个测试套装执行
如果我暂停执行悬挂单元测试,则堆栈跟踪如下:
执行挂在语句static let shared = StoreManager()
上:
class StoreManager: NSObject, CalledByDataStoreInStoreManager {
static let shared = StoreManager() // Instantiate the singleton
// …
}
之前执行并导致测试挂起的另一个单元测试不使用StoreManager
单例。
我的问题是:
尽管第一个测试未使用该单例,但第一个测试却使第二个测试中的单例初始化失败的原因可能是什么?
答案 0 :(得分:1)
因此,显而易见的答案是,在您的第一个测试中发生了一种副作用,正在影响您的第二个测试。但是,确切的副作用取决于两件事:
StoreManager
的初始化程序中发生了什么从您的描述看来,第一个测试在某种程度上影响着StoreManager
初始化中使用的内容,而在第二个测试之前不运行该测试时,则不受影响。
答案 1 :(得分:0)
已解决:BHendricks的答案指出的副作用如下:
由于我的应用程序还使用手表,因此按照Apple的建议,在应用程序委托中激活了监视会话。这是通过在WatchSessionManager
实例中调用一个函数来完成的,此实例的初始化尝试初始化一个单例,Storemanager也尝试将其初始化。
这创建了一个初始化周期死锁。
由于我使用模拟应用程序委托进行单元测试,因此我现在在其中启动了手表连接会话,而无需初始化WatchSessionManager
实例的不必要的初始化,从而避免了死锁。