2012-08-02 154 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