Flutter 測試中的外掛
幾乎所有的 Flutter 外掛 都包含兩個部分:
- Dart 程式碼,提供你的程式碼呼叫的 API。
- 使用特定平臺(或“宿主”)語言編寫的程式碼,例如 Kotlin 或 Swift,用於實現這些 API。
事實上,原生(或宿主)語言程式碼區分了外掛包和標準包。
構建和註冊外掛的宿主部分是 Flutter 應用構建過程的一部分,因此外掛僅在你執行應用程式時才起作用,例如使用 flutter run 或執行 整合測試時。在執行 Dart 單元測試或 小部件測試時,宿主程式碼不可用。如果你正在測試的程式碼呼叫了任何外掛,這通常會導致類似以下的錯誤:
MissingPluginException(No implementation found for method someMethodName on channel some_channel_name)在單元測試使用外掛的程式碼時,有幾種選擇可以避免此異常。以下解決方案按優先順序排列。
封裝外掛
#在大多數情況下,最佳方法是將外掛呼叫封裝在你自己的 API 中,並提供一種在測試中 模擬你自己的 API 的方法。
這有幾個優點:
- 如果外掛 API 發生更改,你無需更新你的測試。
- 你只測試你自己的程式碼,因此你的測試不會因為你使用的外掛的行為而失敗。
- 你可以使用相同的方法,無論外掛如何實現,甚至適用於非外掛包依賴項。
模擬外掛的公共 API
#如果外掛的 API 已經基於類例項,你可以直接模擬它,但需注意以下幾點:
- 如果外掛使用非類函式或靜態方法,則此方法無效。
- 外掛 API 更改時,測試需要更新。
模擬外掛的平臺介面
#如果外掛是 聯邦外掛,它將包含一個平臺介面,允許註冊其內部邏輯的實現。你可以註冊該平臺介面實現的模擬版本,而不是公共 API,但需注意以下幾點:
- 如果外掛不是聯邦外掛,此方法無效。
- 你的測試將包含外掛程式碼的一部分,因此外掛的行為可能會給你的測試帶來問題。例如,如果外掛作為內部快取的一部分寫入檔案,你的測試行為可能會根據你是否曾執行過測試而有所不同。
- 平臺介面更改時,測試可能需要更新。
一個可能需要這樣做的情況是模擬你依賴的包使用的外掛的實現,而不是你自己的程式碼,這樣你就無法更改它的呼叫方式。但是,如果可能,你應該改模擬使用外掛的依賴項。
模擬平臺通道
#如果外掛使用 平臺通道,你可以使用 TestDefaultBinaryMessenger 來模擬平臺通道。僅當由於某種原因上述方法均不可用時才應使用此方法,因為它存在多個缺點:
- 只能模擬使用平臺通道的實現。這意味著,如果某些實現不使用平臺通道,你的測試在某些平臺上執行時將意外地使用真實的實現。
- 平臺通道通常是外掛的內部實現細節。它們可能在外掛的 bug 修復更新中發生重大變化,從而意外地破壞你的測試。
- 聯邦外掛的每個實現中的平臺通道可能不同。例如,你可能設定了模擬平臺通道以使 Windows 計算機上的測試透過,然後發現它們在 macOS 或 Linux 上執行失敗。
- 平臺通道不是強型別的。例如,方法通道經常使用字典,你必須閱讀外掛的實現才能知道鍵字串和值型別是什麼。
由於這些限制,TestDefaultBinaryMessenger 主要用於外掛實現的內部測試,而不是使用外掛的程式碼的測試。
你可能還想檢視 測試外掛。