跳至主要內容

Flutter 測試中的外掛程式

幾乎所有的Flutter 外掛程式都有兩個部分

  • Dart 程式碼,提供您的程式碼呼叫的 API。
  • 以平台特定的(或「主機」)語言(例如 Kotlin 或 Swift)撰寫的程式碼,用於實作這些 API。

事實上,原生(或主機)語言程式碼將外掛程式套件與標準套件區分開來。

建立和註冊外掛程式的主機部分是 Flutter 應用程式建置過程的一部分,因此只有當您的程式碼在您的應用程式中執行時,外掛程式才能運作,例如使用 flutter run 或執行整合測試時。當執行Dart 單元測試Widget 測試時,主機程式碼不可用。如果您正在測試的程式碼呼叫任何外掛程式,這通常會導致以下錯誤

MissingPluginException(No implementation found for method someMethodName on channel some_channel_name)

當對使用外掛程式的程式碼進行單元測試時,有幾種選項可以避免此例外情況。以下解決方案按優先順序排列。

封裝外掛程式

#

在大多數情況下,最佳方法是將外掛程式呼叫封裝在您自己的 API 中,並提供一種在測試中模擬您自己的 API 的方法。

這有幾個優點

  • 如果外掛程式 API 變更,您不需要更新您的測試。
  • 您只測試您自己的程式碼,因此您的測試不會因為您正在使用的外掛程式的行為而失敗。
  • 您可以使用相同的方法,無論外掛程式是如何實作的,甚至對於非外掛程式套件的依賴關係也是如此。

模擬外掛程式的公開 API

#

如果外掛程式的 API 已經基於類別實例,您可以直接模擬它,但要注意以下事項

  • 如果外掛程式使用非類別函式或靜態方法,則此方法將無法運作。
  • 當外掛程式 API 變更時,測試將需要更新。

模擬外掛程式的平台介面

#

如果外掛程式是聯合外掛程式,它將包含一個平台介面,允許註冊其內部邏輯的實作。您可以註冊該平台介面實作的模擬,而不是公開 API,但要注意以下事項

  • 如果外掛程式不是聯合的,則此方法將無法運作。
  • 您的測試將包含部分外掛程式的程式碼,因此外掛程式的行為可能會導致您的測試出現問題。例如,如果外掛程式將檔案寫入為內部快取的一部分,則您的測試行為可能會根據您先前是否執行過測試而改變。
  • 當平台介面變更時,測試可能需要更新。

一個可能需要這樣做的例子是模擬您所依賴的套件使用的外掛程式實作,而不是您自己的程式碼,因此您無法變更其呼叫方式。但是,如果可能,您應該模擬使用外掛程式的依賴關係。

模擬平台通道

#

如果外掛程式使用平台通道,您可以使用TestDefaultBinaryMessenger來模擬平台通道。只有當由於某些原因,上述任何方法都不可用時,才應使用此方法,因為它有幾個缺點

  • 只有使用平台通道的實作才能被模擬。這表示如果某些實作不使用平台通道,您的測試在某些平台上執行時將會意外地使用真實的實作。
  • 平台通道通常是外掛程式的內部實作細節。它們甚至可能會在外掛程式的錯誤修正更新中發生重大變更,從而意外地破壞您的測試。
  • 平台通道在每個聯合外掛程式的實作中可能會有所不同。例如,您可能會設定模擬平台通道,使測試在 Windows 電腦上通過,然後發現它們在 macOS 或 Linux 上執行時失敗。
  • 平台通道不是強型別的。例如,方法通道通常使用字典,您必須讀取外掛程式的實作才能知道索引鍵字串和值類型是什麼。

由於這些限制,TestDefaultBinaryMessenger 主要用於外掛程式實作的內部測試,而不是使用外掛程式的程式碼測試。

您可能還想查看測試外掛程式