ko未定义Chutzpah中的错误

时间:2016-02-18 11:37:22

标签: javascript jquery knockout.js requirejs chutzpah

我正在尝试为我的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声明中尝试相同时,这是行不通的。不知道为什么。

希望你能理解这个问题。

1 个答案:

答案 0 :(得分:2)

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

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