kintone 用の JavaScript ファイルを jasmine や mocha でそのままテストすると、当然ながら kintone オブジェクトはエラーになる。
ReferenceError: kintone is not defined |
これがちょっとイヤだったので、テストコード内であたかも kintone のように振る舞うオブジェクトを作成した。
kintuba
kintuba という npm モジュールとして作成した。
当初kintone stub
を省略したkintub
という名前にしようかと思ったが、ググったらやたらと「きんつば」が出てきたのでkintuba
にした。
一応単体でも動作するけど、ブラウザテストが本筋な気がしたので karma プラグインも一緒に作った。
使用例
ここでも kintone のチュートリアル第 2 回 レコード一覧画面にボタンを置いてみよう!のサンプルを使って、テストをしてみたいと思う。
準備
テストは karma と mocha、chai を使って行うので、必要なモジュールをインストールする。jasmine でもいいけど、async/await なテストは mocha のほうが書きやすいので mocha 採用で
yarn add --dev kintuba karma-kintuba |
今回はやらないけど、alert とか confirm のテストもするなら sinon があるといい
yarn add --dev sinon karma-sinon |
karma.conf.js を作成し、以下のようにする
frameworks
に kintuba を追記する以外は普通の設定
// Karma configuration |
テスト対象コード
- src/target.js
;(function() { |
引用元 : https://developer.cybozu.io/hc/ja/articles/201767270
テストコード
- test/test.js
/* eslint-disable no-undef */ |
これでkarma start
すると、chrome が立ち上がりテストが正常に通る。
特筆すべきところはdo
メソッドのみ
await kintone.events.do('app.record.index.show') |
kintone では画面の移動などでイベントが発火するが、ローカルテストではその動きはできないので、テストコード側で手動発火させる。それがdo
メソッドだ。
非同期で動作し、kintone.events.on
で登録したイベントハンドラの戻り値をkintone.Promise
オブジェクトとして返す。
挫折したところ
app.record.index.show
とか一覧表示のところで、event.records
の配列をソートしたりフィルタする動作は軒並み再現を諦めた。
kintone から取得できる view のデータでは、ソートやフィルタのcondition
は SQL ライクに記述してあるので、JavaScript の Array を操作できる形に書き換えるのはとても骨だ。逆にテストデータを json ではなく sqlite なんかで管理するようにすればそのままソートやフィルタできたのかもしれないが、それはそれでインパクトでかい、どちらにしても変更量が半端ない感じがしたので TODO 状態で放置してある。
作ってみて
個人的には JavaScript の習熟と kintone API への理解が深まった点が大きな収穫だ。ただglobals.kintone
を無理やり上書きしてたり、eval
使ってたり、eslint-disable
をあらゆる所で追記してたりで、本来であればもうちょっとスマートに書けるんじゃないかな?と思うところがかなりある。kintone.api
関連はまだ未実装なメソッドが多く残ってたりするので、実装を進めると同時にリファクタリングもしていきたい。