2

私は自分のjsコードの単体テストを書き始めており、これは初心者です。knockout.jsを使用しており、プロジェクトのビューモデルをテストする必要があります。

サンプルは次のとおりです。

Tasks.jsファイル

var yc = yc || {};

yc.TasksVM = function (options) {
    _addTask = function () {
        yc.AddTask.openDialog();
    },

    _paging = myc.PagingVM();

    _instance = {
        addTask: _addTask,
        paging: _paging,
    };

    return _instance;
}

およびAddTask.jsファイル

var yc = yc || {};

yc.AddTaskVM = function (options) {
    var 
    _openDialog = function (orderId) {
        $.ajax({
            data: data, type: 'get', url: dialogUrl,
            success: function (dialogContent) {
                // ...
            }
        });
    };

    _instance = {
        openDialog: _openDialog
    };

    return _instance;
}

Jasmineを使用してTasksVMをテストしようとすると、を呼び出すためにインスタンス化 する必要があるという問題が発生します。また、電話を受けるには、このファイルをタグに含める必要があります。次に、呼び出しをモックする必要があり ます(また、htmlにjQueryを含めます)。yc.AddTask.openDialog()openDialog()<script>yc.AddTask.openDialog$.ajax

私の質問は結合についてです。

1.yc.AddTask.<my_function>中から電話しても大丈夫yc.TasksVMですか?

.NETの世界から、このインターフェースを介して処理します。すべての外部依存関係を取り除き、ソースコードのインターフェイスのみを使用します。したがって、テストしているコード内のあらゆるものをモックすることができます。

2.これらすべての依存ファイルをhtmlファイルランナーに含める必要がありますか?

4

1 に答える 1

3

1)小規模なアプリケーションでは問題ありませんが、カップリングが多い複雑なアプリケーションの場合は、ある種のEventAggregatorを使用してモデル間で通信します。

2)JSビジネスロジックを単体テストするときは、常にすべてのサービスとDOMインタラクションをモックアウトします。これは、すでにDOMから切り離されているViewModelのみをテストしているため、KOで無料で取得できるDOMインタラクションです(MVVMの最大の利点の1つ)。もしあなたが私に尋ねるなら)。

jQueryはDOMインタラクションライブラリであり、そのサービス部分(post、ajax、getJsonなど)のみを使用する必要があるため、単体テストで行ったのは、$およびjQueryシンボルを上書きして、他の開発者が使用しようとした場合です。 ViewModelからの$( "dom")は、単体テストでクラッシュします。これは、すべての開発者がKOを正しく使用していることを確認するための良い方法です。

単体テストのセットアップで、モックしたいメソッドを上書きするだけです(Jasmineではなく擬似コード)

$.getJSON = function(url, params, success) {
   assert(1, params.id, "It should call our backend with the correct Id");
   success(mockedData);
};

編集:私のプロジェクトでは、Qunitを使用し、基本テスト「クラス」があります。これにはティアダウンがあるため、すべてのモックされた関数がヌルになります。このようにして、別のテストから呼び出すことはできません。

于 2012-12-13T08:55:03.123 に答える