1

我的问题是关于使用 Mocha 对 JavaScript 代码进行单元测试。最终这可能是一个关于依赖注入或控制反转的问题,我对这些概念的理解很差。

我正在尝试编写一个测试,它只是创建一个 header.js 的实例并测试它是一个对象。但是,每当我这样做时,我的测试在加载 Modernizr 时就会爆炸,并显示以下错误消息。这似乎是因为 Modernizr 依赖于在浏览器内部运行,但我的单元测试需要在命令行上运行。

/lib/modernizr.js:8

“MozAppearance”在 l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNod ^ TypeError: 无法读取 /Users/devadmin/devenv/djscript 中未定义的属性 'parentNode' /djscript-vendor/lib/modernizr.js:8:6291

我有一些 requirejs 模块,它们位于以下层次结构中:

lib
└── pj
    ├── module
    │   └── header
    │       └── header.js
    ├── util
    │   └── header
    │       └── Util.js
    └── widget
        └── header
            ├── Header.js
            └── view
                ├── HeaderView.js
                └── NavView.js

header.js 实例化 Header.js,后者依次创建 HeaderView 和 NavView。只有 HeaderView 需要 Modernizr。

关于如何使此代码进入可测试状态的任何提示?看看我如何打包 Modernizr 以与 requirejs 一起使用会有所帮助吗?

4

1 回答 1

2

好吧,我没有专门使用 Mocha,但是您应该能够通过执行类似...

define(<module path/name - e.g. 'libs/modernizr'>, function(){
    return {
        history: false,
        foo: true,
        bar: false
    };
});

...在您尝试加载被测模块之前。定义了假实例后,您的测试模块应该使用假而不是实际的modernizr lib。

您基本上是在劫持 AMD 的“命名模块”(链接:http ://requirejs.org/docs/api.html#modulename )功能,用您的假货代替真正的modernizr。通过这种方式,您可以明确地测试您需要的任何状态。

希望能帮助到你!

于 2012-08-16T00:43:47.560 回答