node.js + mocha なテストで期待値ファイル json にコメント入れたくて minify、と考えたので

時間返せよ。

jsonminify。いいね:

 1 const util = require('util');
 2 // ex. console.log(util.inspect(result, false, null));
 3 const fs = require('fs');
 4 const path = require('path');
 5 const assert = require('assert');
 6 // ...
 7 // ------------------------------------------
 8 var parser = new MalPageParser();
 9 var urlbuilder = new MalUrlBuilder();
10 // ------------------------------------------
11 // npm -g install jsonminify (等)
12 const jsonminify = require('jsonminify');
13 // jsonminify(...) としても使えるし、JSON.minify(...) としても使える。
14 function readJsonFile(fbase, cb) {
15     fs.readFile(
16         path.join(__dirname, "testdata", fbase),
17         {encoding: 'utf-8'},
18         function(err, data) {
19             cb(err, jsonminify(data)); // ここの呼び出し方はちょっとまだ工夫必要
20         });
21 }
22 //
23 describe('MalUrlBuilder#calc_cname', function() {
24     it('currently knwon', function(done) {
25         readJsonFile("expected/known_cnames.json", function(err, data) {
26             // jsonminify 後の幸せな data を受け取る
27             var known = JSON.parse(data);
28             Object.keys(known).forEach(function(context, _) {
29                 known[context].forEach(function(row, _) {
30                     var name = row[0];
31                     var cname = row[1];
32                     assert.equal(
33                         urlbuilder.calc_cname(name, null, context), cname);
34                 });
35             });
36             done();
37         });
38     });
39 });

もう一つ node-json-minify てのもあるみたいだが試してない。


03:50追記:
上のコード、「工夫必要」と書いた通り、「テストしたいのとは別の原因で起こる予期せぬへんちくりんなこと」を上手に扱えてないので、mocha なレポートに綺麗に乗っけたいわけだわね。あと「readJsonFile」言うておるのだから、そこで JSON.parse しちゃえばええやん、てのもあって、なので例えばこんな:

 1 const util = require('util');
 2 // ex. console.log(util.inspect(result, false, null));
 3 const fs = require('fs');
 4 const path = require('path');
 5 const assert = require('assert');
 6 // ...
 7 // ------------------------------------------
 8 var parser = new MalPageParser();
 9 var urlbuilder = new MalUrlBuilder();
10 // ------------------------------------------
11 // npm -g install jsonminify (等)
12 const jsonminify = require('jsonminify');
13 // jsonminify(...) としても使えるし、JSON.minify(...) としても使える。
14 function readJsonFile(fbase, cb) {
15     fs.readFile(
16         path.join(__dirname, "testdata", fbase),
17         {encoding: 'utf-8'},
18         function(err, data) {
19             // とにかく「自覚的に assert でつかまえたんでないチョンボ的な」
20             // なにがしか異常も、「done(err)」に運びたいわけだ。
21             if (err) {
22                 cb(err, data);
23             } else {
24                 try {
25                     data = jsonminify(data);
26                     data = JSON.parse(data);
27                 } catch (perr) {
28                     cb(perr, data);
29                     return;
30                 }
31                 cb(err, data);
32             }
33         });
34 }
35 //
36 describe('MalUrlBuilder#calc_cname', function() {
37     it('currently knwon', function(done) {
38         readJsonFile("expected/known_cnames.json", function(err, known) {
39             // もはや「通常時は」JSON.parse 後の幸せなデータを受け取れる。
40             if (!err) {
41                 // err時は「done(err)」をこそみたいんであって、芋づるで起こってしまう
42                 // ことは見とぅない。
43                 Object.keys(known).forEach(function(context, _) {
44                     known[context].forEach(function(row, _) {
45                         var name = row[0];
46                         var cname = row[1];
47                         assert.equal(urlbuilder.calc_cname(name, null, context), cname);
48                     });
49                 });
50                 done();
51                 return;
52             }
53             done(err);
54         });
55     });
56 });

まぁ色々やりようあるけど。



Related Posts