見出し画像

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開発の旅はつづく。

この記事が気に入ったらサポートをしてみませんか?