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