ko 未定义 Chutzpah 中的错误

ko is not defined Error in Chutzpah

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

我在 Visual Studio 2012 年安装了 Chutzpah。

当我 运行 我的视图模型测试时,它抛出错误,即使正确加载了 knockout js 和其他 js。

Uncaught ReferenceError: ko is not defined

我的Json配置代码:

{
    "Framework": "jasmine",
    "TestHarnessReferenceMode": "AMD",
    "TestHarnessLocationMode": "SettingsFileAdjacent",
    "References" : [
        {"Path" : "../Scripts/require.js" },
        {"Path" : "config.js" }
    ],
    "Tests" : [
      {"Path": "tests"}
    ]
}

我的Config 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);
                });
            });
        });
    });

视图模型代码:

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 (knockout) 吗?

编辑 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;
});

因此,在任何视图模型中,我们都可以获得 knockout as ko 的实例,而无需在每个 veiwmodel 中为 Knockout 声明 require js 内容(如您所建议的)。

但是当我在 Chutzpah 声明中尝试同样的操作时,这是行不通的。不知道为什么。

希望您理解问题所在。

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

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