2

我开始为我的 js 代码编写单元测试,我是这方面的新手。我们使用 knockout.js 并且需要为项目测试我们的视图模型。

这是示例:

任务.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 文件运行器中吗?

4

1 回答 1

3

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

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

jQuery 是一个 DOM 交互库,你应该只使用它的服务部分(post、ajax、getJson 等),所以我为我们的单元测试所做的是覆盖 $ 和 jQuery 符号,所以如果我的任何开发者尝试使用$("dom") 来自 ViewModel 它会在单元测试中崩溃,这是确保所有开发人员都正确使用 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 回答