我开始为我的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文件运行器中?
答案 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并有一个基础测试“类”,它有一个拆解所以它使所有模拟函数无效,这样它们就不能从不同的测试调用