自製 Chai Plugin

image

Credit: Github repo

作為經常使用 Mocha/Chai 的開發者,有時還是覺得 Chai 的功能沒辦法滿足需求。雖然知道 chai 可以自行撰寫 plugin 來更改預設行為,不過一直都沒研究要怎麼做,不過這次正好有機會認真讀了 Chai 的文件後寫了專案要用的 plugin 後來分享一下做法。

這次介紹的範例會放在以下的 github repository 可以參考一下。

yurenju/chai-plugin-example

定義 eq 新功能

不知道大家開始用 JavaScript 新的內建型態 BigInt 了沒?在 node.js v10 也開始支援,理論上已經可以廣泛使用了。使用時跟一般整數一樣,但是要在後綴加個 n 代表它是 BigInt,比如說 100n 就是型態為 BigInt 的整數 100。

但是如果你嘗試著在 Chai 裡面撰寫如下的測試範例時:

image

按照邏輯在第二個測試應該會出錯,並且顯示 30n 不等於 20n,但實際上則會丟出一個莫名其妙的錯誤訊息:

image

原因其實就是 Chai 內部運作沒有考慮到 BigInt 的邏輯。而等待官方支援目前看起來是遙遙無期,不過我們可以利用 Chai plugin 很簡單的就可以解決這個問題。

Chai 的框架提供了許多更改原先邏輯的方法。首先新增一個 helper 模組,並且利用 overwriteMethod 來修改 eq 原本的邏輯:

image

其中有幾個參數:

  • this._obj: 這是原本的 expect() 裡面傳入的參數
  • this.assert: 用來判斷正確與否、訊息以及要比較的兩個數值
  • _super: 原本的判斷式,如果不是我們要處理的狀況則用原本的處理方法

寫完 helper 之後利用 chai.use() 就可以將寫好的模組注入 chai 當中:

image

這樣錯誤訊息就會清楚很多了

image

新增函式

除了可以改寫原本運作邏輯外,也可以新增自訂函式來擴展功能,比如說我們專案裡面有個特殊的回傳格式,我們希望驗證裡面的某個陣列裡特定數值是什麼。

在這個例子裏面,我們希望驗證 response.logs 裡面有個 event 是 SwapToken,而且 log.args 裡面有兩個屬性 fromToken, toToken 分別是特定數值。

image

在 Chai 我們在沒有任何 helper 之前依然可以完成這項工作,但是如果有 helper 之後,我們可以把它寫成更為精簡。比如說我們先設定預期目標是將語法修正成這樣:

image

這樣的語法更容易閱讀,需要的行數也較少。接著我們就可以依照我們想要達成的效果利用 addMethod() 為 Chai 新增 emit 以及 withArgs 函式:

image

就即可達成用更簡潔的語法達成相同效果的驗證。

image

除了這兩個函式外,Chai 還提供了不少功能可以擴展功能,有興趣的可以研讀一下官方文件。

Core Plugin Concepts

這次的範例都可以在以下的 Github repository 找到,想要自己寫 Chai helper 可以試試。當測試寫起來更簡潔易懂後,心情愉快起來感覺開發效率就更高了呢 🤣


讀者回函
讀完本文之後有什麼建議或回饋嗎?請按此在 Twitter 上面分享此文並且提及我,或是透過寄送電子郵件分享你的看法 😎