続: いい加減 node.js で unit test りたくなってきて mocha

いやん、「非同期」という説明で書くから混乱するんじゃん。

見つけたのでさっそく自分のでテストを書き始めようと:

 1 /**
 2  * require: npm install -g mocha
 3  * to test:
 4  *     mocha thisscript
 5  */
 6 const fs = require('fs');
 7 const path = require('path');
 8 const assert = require('assert');  // from mocha
 9 
10 // ...(omit)...
11 
12 // ------------------------------------------
13 var parser = new MalPageParser();
14 var urlbuilder = new MalUrlBuilder();
15 // ------------------------------------------
16 /** ex.
17 describe('Array', function() {
18   describe('#indexOf()', function() {
19     it ('should return -1 when the value is not present', function() {
20       assert.equal([1,2,3].indexOf(4), -1);
21     });
22   });
23 });
24 **/
25 it('MalPageParser#parse_person', function() {
26     var result = {};
27     fs.readFile(path.join(__dirname, "_got_pages/tk.html"), {encoding: 'utf-8'},
28         function(err, data) {
29 
30         result = parser.parse_person(data, {no_timg: true});
31         assert.equal(result["#"], (11661).toString(26));
32         assert.equal(result["n"], "Kurosawa, Tomoyooo");
33     });
34 });

これ、「失敗するテストから始めるべし」の大原則に従って、「必ず失敗する」テストを書いたつもり。

あら…。「0 passing (23ms)」。うーんどうやったらテスト通せるんだ? console.log 入れてみても「ちゃんとコードそのものは動いてる」のよねぇ。

と、なんだかやたらに伝わりにくい ASYNCHRONOUS CODE をガン見して…、やっと理解出来た:

 1 it('MalPageParser#parse_person', function(
 2     done
 3     ) {
 4     var result = {};
 5     fs.readFile(path.join(__dirname, "_got_pages/tk.html"), {encoding: 'utf-8'},
 6         function(err, data) {
 7 
 8         result = parser.parse_person(data, {no_timg: true});
 9         assert.equal(result["#"], (11661).toString(26));
10         assert.equal(result["n"], "Kurosawa, Tomoyooo");
11 
12         done();  // あるいは done(err)
13     });
14 });

「終わったぜっ」をトリガーしてあげないとテスト検出出来ないぜ、てことだわな。確かに「非同期ならでは」とは言えるけれど、もっと広義では、「単にコールバック型のヤツでは常に」てことではないんかいね。

理解してしまえば「そりゃそうか」と思うけれど、説明が上手とは思えない。まぁいいか、わかったし、出来るし。というかこれが出来ちゃったので、ajax かましたテストはこれと全然大差ない、とわかって、まぁ先が読めて良かったかも。(ワタシのコードは「ページそのものをパースするコード」と「ページを ajax で HTML GET しにいくコード」の対になってて、上で例にしたヤツは通信を介しないただの「ページ解析器」。なのでローカルにダウンロードした html ファイル相手にテストを書ける。)