关于javascript:ko未定义Chutzpah中的错误

ko is not defined Error in Chutzpah

我正在尝试为我的SPA项目编写单元测试。我们使用Durandal (Framework), Knockout (Binding) with RequireJs的地方。

我已经在Visual Studio 2012中安装了Chutzpah。

当我为视图模型运行我的测试时,即使敲除js和其他js的加载正确,它也会使我陷入错误之下。

Uncaught ReferenceError: ko is not defined

我的Json配置代码:

1
2
3
4
5
6
7
8
9
10
11
12
{
   "Framework":"jasmine",
   "TestHarnessReferenceMode":"AMD",
   "TestHarnessLocationMode":"SettingsFileAdjacent",
   "References" : [
        {"Path" :"../Scripts/require.js" },
        {"Path" :"config.js" }
    ],
   "Tests" : [
      {"Path":"tests"}
    ]
}

我的配置Js代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
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代码:

1
2
3
4
5
6
7
8
9
10
11
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代码:

1
2
3
4
5
6
7
8
9
10
11
12
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。如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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的实例,而无需在Knockout的每个veiwmodel中声明require js内容(如您所建议的)。

但是当我在Chutzpah声明中尝试相同的方法时,这将无法正常工作。不知道为什么。

希望您能理解问题。


在问题中显示的两个模块中,都使用ko,但没有在依赖项列表中列出knockout。这是获得错误的肯定方法。修改模块以在依赖项中列出knockout,并向您提供给define的回调中添加相应的参数。例如,

1
define(['knockout', 'plugins/dialog'], function (ko, dialog) {