【问题标题】:Knockout JS Unit testing and ViewModel coupling and dependenciesKnockout JS 单元测试和 ViewModel 耦合和依赖关系
【发布时间】:2012-12-13 16:55:03
【问题描述】:

我开始为我的 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 时,我遇到了需要实例化 yc.AddTask.openDialog() 调用openDialog() 的问题。我还需要将此文件包含在<script> 标记中才能接听电话。然后,在yc.AddTask.openDialog 中,我需要模拟$.ajax 调用(并在我的html 中包含jQuery)。

我的问题是关于耦合的。

1.可以从yc.TasksVM内部调用yc.AddTask.<my_function>吗?

.NET 世界,我们通过 接口 处理这个问题。我们移除所有外部依赖并仅在源代码中使用接口。所以我们可以在我们正在测试的代码中模拟任何东西。

2. 是否需要将所有这些依赖文件包含到我的 html 文件运行器中?

【问题讨论】:

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


    【解决方案1】:

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

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

    jQuery 是一个 DOM 交互库,你应该只使用它的 Service 部分(post、ajax、getJson 等),所以我为我们的单元测试所做的就是覆盖 $ 和 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 并有一个基础测试“类”,它有一个拆卸功能,因此它会将所有模拟函数归零,这样就不能从不同的测试中调用它们

    【讨论】:

    • 好的,我理解你的观点。我应该如何处理我的示例?这是我们真正的应用程序的一部分,我需要进行测试。如何处理这个外部方法调用?
    • 您的意思是必须对其进行测试或如何使实际代码的耦合度降低?
    • 我的意思是如何准确地测试这种情况。因为它是生产代码,所以我需要编写测试然后只解耦代码。
    • 只需像我上面的示例那样使用模拟函数覆盖外部调用?
    猜你喜欢
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2018-03-03
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多