mockを作る
GASをローカルで開発
GASをローカルで開発する際に壁になるのは、組み込みオブジェクトのテストができないこと。
SpreadsheetAppも、DocumentAppも使えない…。これではGASの開発はできない。
GCPとつなげてリモートテストするという手段はあります。が、できればローカルで完結させたい。
Jestとモック
そのようなときに役立つのが、モック mock というもののようです。
そして、ローカルのテスティングライブラリにはJestというライブラリを使います。
Jestでモックを作るには、 jest.fn() という関数を使うようです。
jest.fn();
返り値は関数なので、
const mockFunc = jest.fn();
のように使うことも。
GASの組み込み関数をモックするときは、こんな感じで書く。
// test/mocks/Spreadsheet.js
SpreadsheetApp.getActiveSpreadsheet = jest.fn(() => ({
getActiveSheet: jest.fn(() => ({
getDataRange: jest.fn(() => ({
getValues: jest.fn(() => [
["header1", "header2", "header3"],
["john", 32, "apple"],
["bob", 18, "banana"],
["cindy", 24, "cinamon"],
]),
})),
})),
}));
module.exports = SpreadsheetApp;
これで、GASの組み込みオブジェクトが使えないはずのローカルでも、使いたいメソッドを自作して使うことができる。
上のコードは、Spreadsheetオブジェクトに色々なメソッドをネストして埋め込んで、最後に他のファイルでも使えるようにしている。
module.exportsはグローバルに参照可能なオブジェクト。ということなのだろうな。
そして、テストファイルの本体ではこんなことを書く。
// test/functions.test.js
const getDatas_ = require("../src/code");
const SpreadsheetApp = require("./mocks/Spreadsheet");
test("getDatas_", jest.fn(() => {
const { ss } = getDatas_();
expect(typeof ss).toBe("object");
})
);
getDatas_()とかはメインファイルにあります。
// src/code.js
function getDatas_() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const range = sheet.getDataRange();
const values = range.getValues();
return { ss, sheet, range, values };
}
module.exports = getDatas_;
そしてテストを実行する。
課題としては、getValues()のデータを差し替え可能にしたいなあ。データを取ってくる用のファイルとかを作って、それを使えるようにしたらいいのかしら…。
ローカルGAS開発の旅はつづく。
この記事が気に入ったらサポートをしてみませんか?