Knockout JS Unit测试和ViewModel耦合和依赖

时间:2012-12-12 17:13:54

标签: javascript unit-testing knockout.js jasmine dependency-management

我开始为我的js代码编写单元测试,我是新手。我们使用knockout.js并且需要为项目测试我们的viewmodels。

以下是样本:

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 时,我遇到需要实例化 yc.AddTask.openDialog()来调用openDialog()的问题。此外,我需要在<script>标记中包含此文件才能进行调用。然后,在yc.AddTask.openDialog我需要模拟$.ajax调用(并在我的html中包含jQuery)。

我的问题是关于耦合。

1。yc.AddTask.<my_function>内拨打yc.TasksVM是否可以?

.NET世界,我们通过接口来处理这个问题。我们带走的所有外部依赖关系和仅使用源代码中的接口。所以我们可以在我们正在测试的代码中模拟任何内容。

2. 我是否可以将所有这些相关文件包含在我的html文件运行器中?

1 个答案:

答案 0 :(得分:3)

1)在较小的应用程序中它可以,但是对于具有大量耦合的复杂应用程序,我会使用某种EventAggregator在模型之间进行通信。

2)当我对我的JS业务逻辑进行单元测试时,我总是嘲笑所有服务和DOM交互,你通过KO免费获得的DOM交互,因为你只测试已经与DOM分离的ViewModel(最大的一个)如果你问我,MVVM的优势。

jQuery是一个DOM交互库,你应该只使用它的Service部分(post,ajax,getJson等),所以我为Unit测试做的是覆盖$和jQuery符号,所以如果我的任何一个devolpers尝试使用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并有一个基础测试“类”,它有一个拆解所以它使所有模拟函数无​​效,这样它们就不能从不同的测试调用