Mithril 1.1.0

テスト

Mithrilにはospecと呼ばれるテストフレームワークが付属しています。このテストフレームワークと他のフレームワークが異なる点は、yak shavinganalysis paralysisに繋がるような、設定可能な要素をすべて排除した点です。

テストランナーのもっとも簡単なセットアップ方法はNPM scriptを使う方法です。プロジェクトのpackage.jsonファイルを開き、scriptsセクションのtestの項目を編集します:

{
    "name": "my-project",
    "scripts": {
        "test": "ospec"
    }
}

これはJSONファイルなので、"test"はダブルクオートでくくる必要があります。

テストスイートをセットアップする時は、testsフォルダを作り、その中にテストファイルを作っていきます。

// file: tests/math-test.js
var o = require("mithril/ospec/ospec")

o.spec("math", function() {
    o("addition works", function() {
        o(1 + 2).equals(3)
    })
})

テストを実行するにはnpm testコマンドを使います。Ospecはプロジェクトフォルダ内のtestsフォルダに入っているJavaScriptファイルはすべてテストコードだとみなします。

npm test

Mithrilをブラウザ以外の環境で実行する

Mithrilはいくつかのグローバルの要素に少しだけ依存しています。これらはどれもブラウザ環境であればサポートされていますが、非ブラウザ環境ではいくつか定義されていないものもあります。Mithrilのnpmパッケージと一緒にリリーうされているブラウザモックを使うことで、この問題を回避できます。

これを行うための最もシンプルな方法は、Mithrilをインクルードする前に次のコードをプロジェクトにインクルードします。

// MithrilでDOM環境をモックするためのPolyfill
global.window = require("mithril/test-utils/browserMock.js")();
global.document = window.document;

このコードを実行すると、require("mithril")が行えるようになり、幸せになれるでしょう。


良いテストプラクティス

一般的にはテストを書く方法には2つあります。事前と事後です。

事前にテストを書くには仕様を決定する必要があります。事前に書くテストはこれから実装するAPIが従わなければならないルールをコード化するすぐれた方法です。しかし、APIのスコープがよく分からない場合や、変更する可能性がある場合(または過去の経緯からよく変更が行われる場合)、プロジェクトの要件がまだ妥当だと考えられない場合は、テストを先に書くことは適切な戦略ではないかもしれません。

事後に書くテストはシステムの挙動をドキュメント化し、リグレッションを防ぐための方法です。あいまいなコーナーケースでエラーが発生しないこたおを保証したり、すでに修正されたバグが無関係な変更によって再導入されないようにする効果があります。


ユニットテスト

ユニットテストは、アプリケーションを小さな部品(通常は単体のモジュール)に分け、指定された入力に対して期待される出力が返ってくることを表明形式で書くプラクティスです。

Mithrilコンポーネントのテストを書くのは簡単です。単体のコンポーネントが次の形式になっていると想定します:

// MyComponent.js
var m = require("mithril")

module.exports = {
    view: function() {
        return m("div", "Hello world")
    }
}

まずtests/MyComponent.jsファイルを作成し、このコンポーネントに対するテストを次のように作成します:

var MyComponent = require("MyComponent")

o.spec("MyComponent", function() {
    o("returns a div", function() {
        var vnode = MyComponent.view()

        o(vnode.tag).equals("div")
        o(vnode.children.length).equals(1)
        o(vnode.children[0].tag).equals("#")
        o(vnode.children[0].children).equals("Hello world")
    })
})

通常は、vnodeツリーの構造をきめ細かくテストするのではなく、外部の入力によって変化するような動的な側面のみをテストします。Mithril Queryを使うと、深いvnodeツリーのテストが簡単になります。

場合によっては、モジュールを独立してテストするためにモジュールの依存のモックが必要となります。いくつかツールがありますが、Mockeryはそのうちの1つです。


License: MIT. © Leo Horie.