概要
JavaScriptでBotを実装していたら「テストコードを書くとコードがきれいになる」との助言を受けた。
今回はmochaを使ったテストの実行例を紹介する。
なお、当エントリは「Fate/stay nighgt」および「Fate/hollow ataraxia」のネタバレを含んでいる。
環境構築
npm install --global mocha
package.js
への依存関係の記載が必要。
実装
テスト対象となるコード
src/HolyGrail.js
// 「座」に存在する英霊
const SERVANT_LIST = {
"sheath" : "Arthur",
"earring" : "Cuchulain",
"pendant" : "Emiya",
"mirror" : "Medusa",
"book" : "Medea",
"gate" : "Kojiro",
"ax" : "Hercules"
};
/**
* @classdesc 聖杯
*/
var HolyGrail = function() {
/**
* 英霊召喚
* @param {string} catalyst - 触媒
*/
this.contract = function(catalyst) {
var servant = SERVANT_LIST[catalyst];
return servant;
};
};
module.exports = HolyGrail;
テストコード
test/test.js
var assert = require('assert');
// テストスクリプトからの相対パスでrequire
var HolyGrail = require('../src/holygrail');
describe("HolyGrail", function(){
// 凛が所持するペンダントに対応する英霊はアルトリアではない
it("Rin tried:", function(){
var servant = new HolyGrail();
assert.equal("Arthur", servant.contract('pendant'));
});
// 士郎の体内の剣の鞘に対応する英霊はアルトリア
it("Shiro tried:", function(){
var servant = new HolyGrail();
assert.equal("Arthur", servant.contract('sheath'));
});
});
テストコードの書き方は以下のような感じ。
it("テスト名", function(){
var <インスタンス> = new <クラス>(<引数>);
assert.equal(<結果>, <インスタンス>.<メソッド名>(<引数>))
})
今回はわざとコケるテストを書いています。
実行結果
-bash 19:02:43 ]mocha
HolyGrail
1) Rin tried:
✓ Shiro tried:
1 passing (12ms)
1 failing
1) HolyGrail Rin tried::
AssertionError: "Arthur" == "Emiya"
+ expected - actual
-Arthur
+Emiya
at Context.<anonymous> (test/test.js:6:14)
期待通り「Rin」の英霊召喚は彼女の思い通りにはなりませんでした。
package.json
のscripts
プロパティを用いたテスト実行
package.json
の記述(部分)
package.json
"scripts": {
"test": "mocha"
},
実行結果
-bash 19:06:00 ]npm test
> Sebastien@0.0.0 test /Users/wifeofvilon/Projects/mochaTest
> mocha
HolyGrail
1) Rin tried:
✓ Shiro tried:
1 passing (10ms)
1 failing
1) HolyGrail Rin tried::
AssertionError: "Arthur" == "Emiya"
+ expected - actual
-Arthur
+Emiya
at Context.<anonymous> (test/test.js:10:14)
npm ERR! Test failed. See above for more details.
npm ERR! not ok code 0
ポイント
- mochaは特に何も指定しないと
test/
下のファイルを実行するらしい -
module.exports
を指定しないとテストが実行できない - 「Fate」シリーズの「クラス」概念ってすごいよね
参考
MochaでJavaScriptのテストを書く - CLOVER
Node.jsでmochaやproxyquireを使った単体テストをやってみたメモ - Qiita
package.json の scripts - Qiita