40歳からのキャリアチェンジ

20代はエンジニア・PM、30代はWeb系エンジニア向けのキャリアアドバイザー。40代の今はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連あたり

011-ユニットテスト実行時の別ファイルからオブジェクトを読み込む処理にはまる

インスタンス化に失敗

ユニットテストでQUnitを使うというの書きましたがあの時のテストコードは実際の開発をする上ではあまり意味をなさないものだったので本格的にテストコード書き始めました。

  • こんな感じのテストコードを準備
//db_connection.js
module("database connection");

test("unit test for database connection",
  function(){
    var blogDB = new blogDB();
    var blog_id = blogDB.items[0].blog_id;
    equals(blog_id,"199/14992.html");
  }
);
// app.js
var unit = Titanium.UI.createWindow({
    url: 'runner.js',
    title:'Unit Test'
});
var tabUnitTest = Titanium.UI.createTab({

  icon:'KS_nav_views.png',
  title:'Unit Test',
  window:unit
});
tabGroup.addTab(tabUnitTest);

テスト成功すると思ったら何故か

[ERROR] Died on test #1: Result of expression 'blogDB' [undefined] is not a constructor.

というメッセージが出て何故かインスタンス化に失敗する・・・・

試行錯誤した結果こうして解決

  • 外部ファイルの読み込みの部分でエラーになっているかどうか念のため確認するため、あまり意味がないけど、テストコード内に以下記述したらもちろん成功。
var DB = function(){
  this.blog_id = "199/14992.html";
};
test("instance test1",
  function(){
    var _db = new DB();
    // きちんとインスタンス化出来たから以下のテストもパスした
    equals(_db.blog_id,"199/14992.html");
  }
);
  • 上記はパスするっていうことはやっぱりテスト対象のdatabase.jsが読み込めていないようだったから試しにテストコードの先頭に下記追加してテスト実行するが、相変わらず'blogDB' [undefined] is not a constructorのエラーが出て怒られる
Ti.include('database.js');
  • インスタンス化を最初にしておかないとダメなのかもしれないと思いつき、テストは実行できた
Ti.include('database.js');
var blogDB = new blogDB();
module("database connection");
test("unit test for database connection",
  function(){
    var blog_id = blogDB.items[0].blog_id;
    Titanium.API.info(blog_id);
    equals(blog_id,"199/14992.html");
  }
);

テストは実行できるようになったから一安心。

ちなみにテスト結果は

expected: "199/14992.html"
result: "101/14977.html"

となってパスしないので、自分が思っていたような動作になってないから、このテストがパスするコードを明日以降書かないと。

次回書きたい/書くこと

  • テストにパスするコード