我想單元測試一個作爲CBPeripheralManagerDelegate
到CBPeripheralManager
類的類。通常情況下,爲了去掉外部類的依賴關係,我可以通過類初始化程序或通過屬性傳遞依賴注入的形式。在處理基於單例的API時,我能夠使用像Kiwi這樣的庫來存儲返回單例的類級方法(即[ClassName stub:@selector(sharedInstance) andReturn:myStubbedInstance]
)。在嘲諷CBPeripheralManager
的情況下,問題是它的初始化程序需要委託實例。因此,使用我的類的任何代碼都需要做這樣的事情:一個單元如何測試與核心藍牙API交互的代碼?
PeripheralManagerWrapper *wrapper = [[PeripheralManagerWrapper alloc] init];
CBPeripheralManager *peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:wrapper queue:nil options:nil];
wrapper.peripheralManager = peripheralManager;
然後,單元測試我PeripheralManagerWrapper
類,我可以簡單地將它實例化,並通過在嘲笑CBPeripheralManager
。但是,我不喜歡要求我的包裝對象的任何調用代碼必須通過此設置。處理這種情況是否有更好的模式?我已經使用了Kiwi和OCMockito,但似乎都沒有提供這種功能,因爲它們可能不會提供CBPeripheralManager
的alloc
和init
方法的存根,然後只是在PeripheralManagerWrapper
的初始化程序中實例化實例。
是的,包裝並不是真正的測試,而是更多的隔離遠離ViewController的藍牙行爲。包裝可能不是最好的後綴。 –
好。將業務邏輯與第三方API分開始終是一種很好的做法。我有回答你的問題嗎? – allprog
是的,很抱歉沒有將它標記爲這樣! –