2012-08-02 155 views
1

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

我想写一个测试,它只是创建一个header.js的实例并测试它是一个对象。然而,无论何时我这样做,我的测试在装载Modernizr时爆炸,并带有以下错误消息。这似乎是因为Modernizr依赖于在浏览器内部运行而发生的,但我的单元测试需要在命令行上运行。

/lib/modernizr.js:8 

“MozAppearance” 在l.style,S = R & & !! b.createRange()compareNode,T = L:?n.parentNod ^ 类型错误:无法读取属性 'parentNode'在/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一起使用会有帮助吗?

回答

2

很好,我没有用过摩卡特别,但你应该能够在您的测试做类似的东西/线束创建一个假的Modernizr的实例...

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

...你尝试之前加载你的模块进行测试。通过定义伪造的实例,你的模块应该使用伪造的而不是实际的modernizr库。

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

希望它有帮助!

+0

似乎有帮助,我的测试是一个大混乱,可能完全拉下这个问题。 – the0ther 2012-08-16 15:43:24