何かと面倒なクライアントサイドのテストを Karma で行う手順をまとめます。ついでに TypeScript と AngularJS を組み合わせてみます。

必要な知識

  • NodeJS / npm
  • bower
  • TypeScript
  • tsd

必要なものをインストールする

依存モジュールなどを入れていきます。TypeScript 、 bower 、 tsd などがなければ先に入れておきましょう。

karma-clikarma コマンドが入ります。

$ npm install -g karma-cli
$ npm install karma karma-typescript-preprocessor
$ bower install assert angular angular-mocks
$ tsd query angular angular-mocks assert mocha -rosa install

モージュールを用意する

例として頭に nice とつけるだけの filter を作成します。

///<reference path="typings/tsd.d.ts" />

angular.module('niceModule', []).filter('niceFilter', () => {
return (s: string): string => 'nice ' + s;
});

テストの準備する

テストコードを書いて、適当な名前で保存しておきます。

///<reference path="typings/tsd.d.ts" />

describe('niceModule - niceFilter', () => {

beforeEach(module('niceModule'));

it('should return nice string', inject(($filter) => {
    var niceFilter = $filter('niceFilter');
    assert.strictEqual(niceFilter('person'), 'nice person');
}));

});

次に Karma の設定ファイルや依存モジュールを用意するために karma init を実行します。いろいろ聞かれるので答えていきましょう。すると karma.conf.js というファイルが作られるはずです。

更に preprocessors に TypeScript 用の設定などを追加していきます。

module.exports = function(config) {
config.set({
    basePath: '',
    frameworks: ['mocha'],
    files: [
        'bower_components/angular/angular.js',
        'bower_components/angular-mocks/angular-mocks.js',
        'bower_components/assert/assert.js',
        '*.ts'
    ],
    exclude: [],
    preprocessors: {
        '**/*.ts': ['typescript'] // TypeScript 用の設定
    },
    reporters: ['progress'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: false,
    browsers: ['Chrome'],
    singleRun: true
});
};

こんな感じに編集すればOKです。

テストを実行する

以下のコマンドを実行すればテストが実行されます。Chrome のウィンドウが開き、実際のテストはそこで行われます。

$ karma start

問題がなければ SUCCESS と表示されるはずです。

もし問題があればターミナルにエラーメッセージと一緒に FAILED と表示されます。モジュールの 'nice ''mice ' に書き換えるなどするとわかります。

まとめ

  • $ npm install -g karma-clikarma コマンドが入る
  • $ karma init で設定ファイル、依存関係を準備する
  • $ karma start でテストを実行