いやん、「非同期」という説明で書くから混乱するんじゃん。
見つけたのでさっそく自分のでテストを書き始めようと:
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 ファイル相手にテストを書ける。)