簡體   English   中英

一個單元如何測試與Core Bluetooth API交互的代碼?

[英]How does one unit test code that interacts with the Core Bluetooth APIs?

我想將一個充當CBPeripheralManagerDelegate的類單元測試到CBPeripheralManager類。 通常,為了存根外部類依賴項,我將通過類初始化程序或通過屬性傳入一種依賴注入形式。 在處理基於單例的API時,我已經能夠使用像Kiwi這樣的庫來存根返回單例的類級方法(即[ClassName stub:@selector(sharedInstance) andReturn:myStubbedInstance] )。 模擬CBPeripheralManager是它的初始化程序接受委托實例。 因此,使用我的類的任何代碼都需要執行以下操作:

PeripheralManagerWrapper *wrapper = [[PeripheralManagerWrapper alloc] init];
CBPeripheralManager *peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:wrapper queue:nil options:nil];
wrapper.peripheralManager = peripheralManager;

然后,為了對我的PeripheralManagerWrapper類進行單元測試,我可以簡單地實例化它並傳入一個CBPeripheralManager 但是,我不喜歡要求我的包裝器對象的任何調用代碼必須通過此設置。 處理這種情況有更好的模式嗎? 我已經使用過Kiwi和OCMockito,但似乎都沒有提供這個功能,可能是對CBPeripheralManagerallocinit方法進行了CBPeripheralManager ,然后只是在PeripheralManagerWrapper的初始化程序中實例化實例。

恕我直言,核心藍牙API完美匹配單元測試。 所有委托回調都采用管理器和相關參數,因此如果您遵循使用這些參數而不是內部狀態的模式,那么您將能夠傳遞任何您想要的內容。 使用模擬對象是執行此操作的最佳方法。 在進行單元測試時,您不應該試圖模仿經理的行為。 您應該專注於驗證代碼與API的交互,僅此而已。

包裝可能更適合集成測試。 但實際上,核心藍牙代碼的集成測試最好根據我的經驗手動完成。 堆棧不夠穩定,無法進行可靠的測試,而且測試代碼也必須加強堆棧錯誤,這實際上很難,因為很明顯,僅通過查看API就沒有記錄或預測。 另一方面,您的測試代碼也必須模擬堆棧的錯誤行為。 可能存在可能的情況,但測試代碼將與您測試的代碼一樣復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM