script.aculo.usを読み解く

第10回 unittest.js(後編)

この記事を読むのに必要な時間:およそ 12 分

前回に引き続いて,unittest.jsを解説します。豊富に用意されているアサートの関数名は,JUnitを使った経験があるかたには,なじみのあるものだと思います。

Test.Unit.Assertions

Test.Unit.Assertionsは,テスト内部で使うアサートのクラスです。アサートの成功,失敗,エラーの数もこのクラスで管理します。

0251:Test.Unit.Assertions = Class.create();
0252:Test.Unit.Assertions.prototype = {
0253:  initialize: function() {
0254:    this.assertions = 0;
0255:    this.failures   = 0;
0256:    this.errors     = 0;
0257:    this.messages   = [];
0258:  },

252~258行目のinitializeは,インスタンスの初期化をする関数です。assertionsはアサートの成功の数,failuresは失敗の数,errorsはエラーの数,messagesは,テストのメッセージをまとめるための配列です。

0259:  summary: function() {
0260:    return (
0261:      this.assertions + " assertions, " + 
0262:      this.failures   + " failures, " +
0263:      this.errors     + " errors" + "\n" +
0264:      this.messages.join("\n"));
0265:  },

259~265行目のsummaryは,アサートの成功の数,失敗の数,エラーの数,メッセージをまとめた文字列を返す関数です。

0266:  pass: function() {
0267:    this.assertions++;
0268:  },

266~268行目のpassは,アサートが成功したときに呼ばれる関数です。assertionsをインクリメントします。

0269:  fail: function(message) {
0270:    this.failures++;
0271:    this.messages.push("Failure: " + message);
0272:  },

269~272行目のfailは,アサートが失敗したときに呼ばれる関数です。failuresをインクリメントします。失敗のメッセージを追加します。

0273:  info: function(message) {
0274:    this.messages.push("Info: " + message);
0275:  },

273~275行目のinfoは,メッセージを追加する関数です。

0276:  error: function(error) {
0277:    this.errors++;
0278:    this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
0279:  },

276~279行目のerrorは,アサートの実行中にエラーがあったときに呼ばれる関数です。errorsをインクリメントします。エラーメッセージを追加します。

0280:  status: function() {
0281:    if (this.failures > 0) return 'failed';
0282:    if (this.errors > 0) return 'error';
0283:    return 'passed';
0284:  },

280~284行目のstatusは,アサートの結果から,失敗がひとつでもあれば'failed'を,同様にエラーがあれば'error'を,何もなければ'passed'を返す関数です。

アサートのための関数群

0285:  assert: function(expression) {
0286:    var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';
0287:    try { expression ? this.pass() : 
0288:      this.fail(message); }
0289:    catch(e) { this.error(e); }
0290:  },

285~290行目のassertは,与える式が必ずtrueを返すというアサートです。

0291:  assertEqual: function(expected, actual) {
0292:    var message = arguments[2] || "assertEqual";
0293:    try { (expected == actual) ? this.pass() :
0294:      this.fail(message + ': expected "' + Test.Unit.inspect(expected) + 
0295:        '", actual "' + Test.Unit.inspect(actual) + '"'); }
0296:    catch(e) { this.error(e); }
0297:  },

291~297行目のassertEqualは,"予想の値","実際の値"として,それらが必ず等しいというアサートです。

0298:  assertInspect: function(expected, actual) {
0299:    var message = arguments[2] || "assertInspect";
0300:    try { (expected == actual.inspect()) ? this.pass() :
0301:      this.fail(message + ': expected "' + Test.Unit.inspect(expected) + 
0302:        '", actual "' + Test.Unit.inspect(actual) + '"'); }
0303:    catch(e) { this.error(e); }
0304:  },

298~304行目のassertInspectは,"予想のInspect","実際の値"として,そのインスペクトが必ず等しいというアサートです。

0305:  assertEnumEqual: function(expected, actual) {
0306:    var message = arguments[2] || "assertEnumEqual";
0307:    try { $A(expected).length == $A(actual).length && 
0308:      expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ?
0309:        this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) + 
0310:          ', actual ' + Test.Unit.inspect(actual)); }
0311:    catch(e) { this.error(e); }
0312:  },

305~312行目のassertEnumEqualは,"予想の配列","実際の配列"として,それらの配列の内容が必ず等しいというアサートです。

0313:  assertNotEqual: function(expected, actual) {
0314:    var message = arguments[2] || "assertNotEqual";
0315:    try { (expected != actual) ? this.pass() : 
0316:      this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
0317:    catch(e) { this.error(e); }
0318:  },

313~318行目のassertNotEqualは,assertEqualの反対で,"予想の値","実際の値"として,それらが必ず等しくないというアサートです。

0319:  assertIdentical: function(expected, actual) { 
0320:    var message = arguments[2] || "assertIdentical"; 
0321:    try { (expected === actual) ? this.pass() : 
0322:      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
0323:        '", actual "' + Test.Unit.inspect(actual) + '"'); } 
0324:    catch(e) { this.error(e); } 
0325:  },

319~325行目のassertIdenticalは,assertEqualとほとんど同じですが,比較に===を使うところが違います。"予想の値","実際の値"として,それらが===で比較して必ず等しいというアサートです。

0326:  assertNotIdentical: function(expected, actual) { 
0327:    var message = arguments[2] || "assertNotIdentical"; 
0328:    try { !(expected === actual) ? this.pass() : 
0329:      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
0330:        '", actual "' + Test.Unit.inspect(actual) + '"'); } 
0331:    catch(e) { this.error(e); } 
0332:  },

326~332行目のassertNotIdenticalは,assertIdenticalの反対で,"予想の値","実際の値"として,それらが===で比較して必ず等しくないというアサートです。

著者プロフィール

源馬照明(げんまてるあき)

名古屋大学大学院多元数理科学研究科1年。学部生のときにSchemeの素晴らしさを知ったのをきっかけに,関数型言語の世界へ。JavaScriptに,ブラウザからすぐに試せる関数型言語としての魅力と将来性を感じている。

ブログ:Gemmaの日記

コメント

コメントの記入