使用Modernizr的单元测试代码

时间:2012-08-02 21:51:40

标签: javascript unit-testing requirejs modernizr mocha

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

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

/lib/modernizr.js:8

l.style中的“MozAppearance”,s = r&& !! b.createRange()。compareNode,t = s?l:n.parentNod                                                                     ^ TypeError:无法读取未定义的属性“parentNode”     at /Users/devadmin/devenv/djscript/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一起使用会有帮助吗?

1 个答案:

答案 0 :(得分:2)

好吧,我没有专门使用过Mocha,但是你应该能够通过做类似的事情在你的测试/工具中创建一个假的Modernizr实例。

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)功能,用真假替换真正的现代化。通过这种方式,您可以明确地测试您需要的任何状态。

希望它有所帮助!

相关问题