我正在尝试为我的SPA项目编写单元测试。我们使用Durandal (Framework), Knockout (Binding) with RequireJs
的地方。
我在Visual Studio 2012中安装了Chutzpah。
当我为View模型运行我的测试时,即使正确加载了淘汰赛js和其他js,它也会让我失误。
未捕获的ReferenceError:未定义ko
我的Json配置代码:
{
"Framework": "jasmine",
"TestHarnessReferenceMode": "AMD",
"TestHarnessLocationMode": "SettingsFileAdjacent",
"References" : [
{"Path" : "../Scripts/require.js" },
{"Path" : "config.js" }
],
"Tests" : [
{"Path": "tests"}
]
}
我的配置Js代码:
require.config({
paths: {
'text': '../Scripts/text',
'durandal': '../Scripts/durandal',
'plugins': '../Scripts/durandal/plugins',
'jquery': '../Scripts/jquery-2.1.4',
'knockout': '../Scripts/knockout-3.3.0'
},
shim: {
}
});
我的FirstTest.Js代码:
define(['project/modules/Settings/Subscriber/Viewmodels/Channels'],
function (nChannel) {
describe("Get Channels", function () {
it("will check the Get Channels call and result", function () {
var disp = nChannel.getChannels().then(function () {
var actualResult = ko.toJS(nChannel.Channels);
expect(actualResult.length).toEqual(3);
});
});
});
});
ViewModel代码:
define(['plugins/dialog'], function (dialog) {
var subscriberList = ko.observableArray(); //Getting Error here - while loading the Js for Unit Testing
var JsQ = $; //Getting JQUERY members here. // Works good.
//Other Logics goes here
return {
subscriberList : subscriberList,
JsQ : JsQ
};
});
Jquery的配置非常完美,因为淘汰也是如此。但是给出错误。
任何想法/建议错误原因?
我是否需要单独加载ko(淘汰赛)?
编辑1:
我尝试将knockout
更改为ko
,但却给出了错误Uncaught Error: Script error for: knockout
。
编辑2:
当我应用此解决方案时,我遇到的问题是,那些现有的代码文件需要大量更改,文件数量为数百个。从Init.Js
我们加载了Jquery和Knockout。如下所示。
requirejs.config({
paths: {
'text': '../Scripts/text',
'durandal': '../Scripts/durandal',
'plugins': '../Scripts/durandal/plugins'
}
});
define('jquery', [], function () {
return jQuery;
});
define('knockout', [], function () {
return ko;
});
因此在任何viewmodel中我们都可以得到knockout as ko
的实例,而不是在每个veiwmodel中为Knockout声明需要js的东西(正如你的建议)。
但是当我在Chutzpah声明中尝试相同时,这是行不通的。不知道为什么。
希望你能理解这个问题。
答案 0 :(得分:2)
在您在问题中显示的两个模块中,您使用ko
,但未在依赖项列表中列出knockout
。这是获得错误的可靠方法。修改模块以在依赖项中列出knockout
,并将相应的参数添加到您为define
提供的回调中。例如,
define(['knockout', 'plugins/dialog'], function (ko, dialog) {