1分でわかるJavaScriptライブラリSinon.jsのspyの基本的な使い方

Sinon.jsとは

Sinon.jsとはJavaScriptでテストダブル(テストの代役)を実現するライブラリ。使用するにはnode.jsとSinon.jsが必要。

まずSinon.jsを下記のコマンドでインストールする。

$ npm i sinon

インストールが完了したらs.jsのような適当なJavaScriptを作成してrequire記述してで読み込む。

const sinon = require('sinon');

実行は $ node s.js

Sinon.jsのspyについて

Sinon.jsのspyは以下のように作成する。指定された引数だけobj.numを増やすサンプルのオブジェクトも追加した。サンプルではinc()を見るようにした。

const obj = {
  num: 0,
  inc(n = 1) {
    this.num += n;
    return this.num;
  }
};
const sinon = require('sinon');
const spy = sinon.spy(obj, 'inc');

spy.calledで呼び出しの真偽を取得

const obj = {
  num: 0,
  inc(n = 1) {
    this.num += n;
    return this.num;
  }
};
const sinon = require('sinon');
const spy = sinon.spy(obj, 'inc');

obj.inc();
console.log(spy.called);
// => true

一度も呼び出されなければfalseになる。

const obj = {
  num: 0,
  inc(n = 1) {
    this.num += n;
    return this.num;
  }
};
const sinon = require('sinon');
const spy = sinon.spy(obj, 'inc');

console.log(spy.called);
// => false

spy.calledで呼び出し回数を取得

const obj = {
  num: 0,
  inc(n = 1) {
    this.num += n;
    return this.num;
  }
};
const sinon = require('sinon');
const spy = sinon.spy(obj, 'inc');

obj.inc();
obj.inc();
console.log(spy.callCount);
// => 2

spy.argsで引数を取得

const obj = {
  num: 0,
  inc(n = 1) {
    this.num += n;
    return this.num;
  }
};
const sinon = require('sinon');
const spy = sinon.spy(obj, 'inc');

obj.inc();
obj.inc(3);
console.log(JSON.stringify(spy.args));
// => [[],[3]]

spy.returnValuesで戻り値を取得

const obj = {
  num: 0,
  inc(n = 1) {
    this.num += n;
    return this.num;
  }
};
const sinon = require('sinon');
const spy = sinon.spy(obj, 'inc');

obj.inc();
obj.inc(3);
console.log(JSON.stringify(spy.returnValues));
// => [1,4]

spy.thisValues[0]でオブジェクトの値を取得

const obj = {
  num: 0,
  inc(n = 1) {
    this.num += n;
    return this.num;
  }
};
const sinon = require('sinon');
const spy = sinon.spy(obj, 'inc');

obj.inc();
obj.inc(3);
console.log(spy.thisValues[0]);
// => { num: 4, inc: {略} }