ライブラリを書いていると、公開するAPIのスキーマをテストしたいことがあります。
例えば、以下のような非常に小さなライブラリ。
const hello = 'hello'
module.exports = name => {
return `${hello} ${name}`
}
module.exports.first = 1
module.exports.noop = () => {}
ここで、公開されているAPIは、module.exportsで公開したFunction
とfirst
とnoop
です。
しかし、APIを変更する必要が出て、firstを以下のようにnumberからfunctionへと変更したとします。
module.exports.first = () => 1
もちろんそれぞれにユニットテストを書くのは重要ですが、スキーマがあると安心です。
jestをインストールし、以下のようなコードを用意します。
yarn add --dev jest
test('public API snapshot', () => {
const api = require('.')
const schema = Object.keys(api).reduce(
(acc, k) => ({ ...acc, [k]: typeof api[k] }),
{ 'module.exports': typeof api }
)
expect(schema).toMatchSnapshot()
})
これで、module.exports
によって公開されたスキーマのスナップショットを取ることができます。
例えば、上記のようにnumber
からfunction
へと公開するAPIが変わったら以下のようにFailします。
もちろん、新しいAPIを公開したときもFailします。
module.exports.second = () => 2
これによって、カバレッジを見るまでもなく、テストすべき関数がひと目でわかります。また、バージョニングの指標の一つになるでしょう。(コミットメッセージによるセマンティックリリースはあくまで人間の手よる手動管理という認識です)
終わりに
荒削りですが、以上です。
何か議論があればコメント欄またはTwitterまでお願いします。
PublicなAPIのスキーマのスナップショットテスト。ちょっと面白いかも知れない。 pic.twitter.com/i9vPAKJ9fz
— あかめ@無職.js (@akameco) November 7, 2017